1*64083172STakuya Shimizu // RUN: %clang_cc1 -fcxx-exceptions -fsyntax-only -Wunused -Wunused-template -Wunused-exception-parameter -Wunused-member-function -fdiagnostics-print-source-range-info %s 2>&1 | FileCheck %s --strict-whitespace
2*64083172STakuya Shimizu #include "Inputs/diag-unused-source-ranges.h"
3*64083172STakuya Shimizu
4*64083172STakuya Shimizu #define CAT(a, b) a ## b
5*64083172STakuya Shimizu
6*64083172STakuya Shimizu // CHECK: :{55:15-55:20}: warning: unused exception parameter 'param'
7*64083172STakuya Shimizu // CHECK-NEXT: catch (int ¶m) {}
8*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~{{$}}
9*64083172STakuya Shimizu
10*64083172STakuya Shimizu // CHECK: :{53:7-53:12}: warning: unused variable 'local'
11*64083172STakuya Shimizu // CHECK-NEXT: int local = 0;
12*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~{{$}}
13*64083172STakuya Shimizu
14*64083172STakuya Shimizu // CHECK: In file included from
15*64083172STakuya Shimizu // CHECK-NEXT: :{1:13-1:18}: warning: 'static' function 'thing' declared in header file should be declared 'static inline'
16*64083172STakuya Shimizu // CHECK-NEXT: static void thing(void) {}
17*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~{{$}}
18*64083172STakuya Shimizu
19*64083172STakuya Shimizu namespace {
20*64083172STakuya Shimizu class A {
21*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:10-[[@LINE+3]]:14}: warning: member function 'func' is not needed
22*64083172STakuya Shimizu // CHECK-NEXT: void func() {}
23*64083172STakuya Shimizu // CHECK-NEXT: ^~~~{{$}}
func()24*64083172STakuya Shimizu void func() {}
25*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:32-[[@LINE+3]]:37}: warning: unused function template
26*64083172STakuya Shimizu // CHECK-NEXT: void templ(T) {}
27*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~{{$}}
templ(T)28*64083172STakuya Shimizu template <typename T> void templ(T) {}
29*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:22-[[@LINE+3]]:32}: warning: member function 'templ<int>' is not needed
30*64083172STakuya Shimizu // CHECK-NEXT: void templ<int>(int) {}
31*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~~{{$}}
templ(int)32*64083172STakuya Shimizu template <> void templ<int>(int) {}
33*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:22-[[@LINE+3]]:27}: warning: member function 'templ<float>' is not needed
34*64083172STakuya Shimizu // CHECK-NEXT: void templ(float) {}
35*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~{{$}}
templ(float)36*64083172STakuya Shimizu template <> void templ(float) {}
37*64083172STakuya Shimizu
38*64083172STakuya Shimizu // CHECK: :{[[@LINE+4]]:10-[[@LINE+4]]:13}: warning: unused function template
39*64083172STakuya Shimizu // CHECK-NEXT: void foo() {
40*64083172STakuya Shimizu // CHECK-NEXT: ^~~{{$}}
41*64083172STakuya Shimizu template <typename T>
foo()42*64083172STakuya Shimizu void foo() {
43*64083172STakuya Shimizu func();
44*64083172STakuya Shimizu templ(0);
45*64083172STakuya Shimizu templ(0.0f);
46*64083172STakuya Shimizu templ(0.0);
47*64083172STakuya Shimizu }
48*64083172STakuya Shimizu };
49*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:12-[[@LINE+3]]:23}: warning: unused function 'unused_func'
50*64083172STakuya Shimizu // CHECK-NEXT: static int unused_func(int aaa, char bbb) {
51*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~~~{{$}}
unused_func(int aaa,char bbb)52*64083172STakuya Shimizu static int unused_func(int aaa, char bbb) {
53*64083172STakuya Shimizu int local = 0;
54*64083172STakuya Shimizu try{}
55*64083172STakuya Shimizu catch (int ¶m) {}
56*64083172STakuya Shimizu return 0;
57*64083172STakuya Shimizu }
58*64083172STakuya Shimizu
59*64083172STakuya Shimizu // CHECK: :{[[@LINE+4]]:6-[[@LINE+4]]:16}: warning: unused function template
60*64083172STakuya Shimizu // CHECK-NEXT: auto arrow_decl(T a, T b) ->
61*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~~{{$}}
62*64083172STakuya Shimizu template <typename T>
arrow_decl(T a,T b)63*64083172STakuya Shimizu auto arrow_decl(T a, T b) -> decltype(a + b) { thing(); return a + b; }
64*64083172STakuya Shimizu
65*64083172STakuya Shimizu // CHECK: :{[[@LINE+4]]:6-[[@LINE+4]]:21}: warning: unused function 'arrow_decl<int>'
66*64083172STakuya Shimizu // CHECK-NEXT: auto arrow_decl<int>(int a, int b) ->
67*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~~~~~~~{{$}}
68*64083172STakuya Shimizu template <>
arrow_decl(int a,int b)69*64083172STakuya Shimizu auto arrow_decl<int>(int a, int b) -> int { return a + b; }
70*64083172STakuya Shimizu
71*64083172STakuya Shimizu
72*64083172STakuya Shimizu // CHECK: :{[[@LINE+4]]:10-[[@LINE+4]]:20}: warning: unused function template
73*64083172STakuya Shimizu // CHECK-NEXT: static T func_templ(int bbb, T ccc) {
74*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~~{{$}}
75*64083172STakuya Shimizu template <typename T>
func_templ(int bbb,T ccc)76*64083172STakuya Shimizu static T func_templ(int bbb, T ccc) {
77*64083172STakuya Shimizu return ccc;
78*64083172STakuya Shimizu }
79*64083172STakuya Shimizu
80*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:17-[[@LINE+3]]:32}: warning: function 'func_templ<int>' is not needed
81*64083172STakuya Shimizu // CHECK-NEXT: int func_templ<int>(int bbb, int ccc) {
82*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~~~~~~~{{$}}
func_templ(int bbb,int ccc)83*64083172STakuya Shimizu template <> int func_templ<int>(int bbb, int ccc) {
84*64083172STakuya Shimizu return bbb;
85*64083172STakuya Shimizu }
86*64083172STakuya Shimizu
87*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:35-[[@LINE+3]]:47}: warning: unused function template
88*64083172STakuya Shimizu // CHECK-NEXT: static void never_called() {
89*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~~~~{{$}}
never_called()90*64083172STakuya Shimizu template <typename T> static void never_called() {
91*64083172STakuya Shimizu func_templ<int>(0, 0);
92*64083172STakuya Shimizu }
93*64083172STakuya Shimizu
94*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:22-[[@LINE+3]]:31}: warning: unused variable template
95*64083172STakuya Shimizu // CHECK-NEXT: int var_templ =
96*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~{{$}}
97*64083172STakuya Shimizu template <int n> int var_templ = n * var_templ<n-1>;
98*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:17-[[@LINE+3]]:29}: warning: variable 'var_templ<0>' is not needed
99*64083172STakuya Shimizu // CHECK-NEXT: int var_templ<0> =
100*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~~~~{{$}}
101*64083172STakuya Shimizu template <> int var_templ<0> = 1;
102*64083172STakuya Shimizu struct {
103*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:8-[[@LINE+3]]:11}: warning: unused member function 'fun'
104*64083172STakuya Shimizu // CHECK-NEXT: void fun() {}
105*64083172STakuya Shimizu // CHECK-NEXT: ^~~{{$}}
fun__anond93826520111::__anond93826520208106*64083172STakuya Shimizu void fun() {}
107*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:3-[[@LINE+3]]:8}: warning: unused variable 'var_x'
108*64083172STakuya Shimizu // CHECK-NEXT: } var_x;
109*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~{{$}}
110*64083172STakuya Shimizu } var_x;
111*64083172STakuya Shimizu
112*64083172STakuya Shimizu // CHECK: :{[[@LINE+5]]:12-[[@LINE+6]]:12}: warning: unused variable 'new_line'
113*64083172STakuya Shimizu // CHECK-NEXT: static int CAT(new_,
114*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~{{$}}
115*64083172STakuya Shimizu // CHECK-NEXT: line) =
116*64083172STakuya Shimizu // CHECK-NEXT: ~~~~~{{$}}
117*64083172STakuya Shimizu static int CAT(new_,
118*64083172STakuya Shimizu line) = sizeof(var_templ<0>);
119*64083172STakuya Shimizu }
120*64083172STakuya Shimizu
121*64083172STakuya Shimizu // CHECK: :{[[@LINE+3]]:15-[[@LINE+3]]:27}: warning: unused variable 'const_unused'
122*64083172STakuya Shimizu // CHECK-NEXT: constexpr int const_unused = 1
123*64083172STakuya Shimizu // CHECK-NEXT: ^~~~~~~~~~~~{{$}}
124*64083172STakuya Shimizu constexpr int const_unused = 1;
125