xref: /llvm-project/clang/test/SemaTemplate/self-comparison.cpp (revision 17773fcd83ff8d23260d23706a0dd5fd08902b63)
1*17773fcdSChandler Carruth // RUN: %clang_cc1 -fsyntax-only -verify %s
2*17773fcdSChandler Carruth 
foo()3*17773fcdSChandler Carruth template <int A, int B> void foo() {
4*17773fcdSChandler Carruth   (void)(A == A); // expected-warning {{self-comparison always evaluates to true}}
5*17773fcdSChandler Carruth   (void)(A == B);
6*17773fcdSChandler Carruth }
7*17773fcdSChandler Carruth template <int A, int B> struct S1 {
fooS18*17773fcdSChandler Carruth   void foo() {
9*17773fcdSChandler Carruth     (void)(A == A); // expected-warning {{self-comparison always evaluates to true}}
10*17773fcdSChandler Carruth     (void)(A == B);
11*17773fcdSChandler Carruth   }
12*17773fcdSChandler Carruth };
13*17773fcdSChandler Carruth 
14*17773fcdSChandler Carruth template <int A, int B> struct S2 {
fooS215*17773fcdSChandler Carruth   template <typename T> T foo() {
16*17773fcdSChandler Carruth     (void)(A == A); // expected-warning {{self-comparison always evaluates to true}}
17*17773fcdSChandler Carruth     (void)(A == B);
18*17773fcdSChandler Carruth   }
19*17773fcdSChandler Carruth };
20*17773fcdSChandler Carruth 
21*17773fcdSChandler Carruth struct S3 {
fooS322*17773fcdSChandler Carruth   template <int A, int B> void foo() {
23*17773fcdSChandler Carruth     (void)(A == A); // expected-warning {{self-comparison always evaluates to true}}
24*17773fcdSChandler Carruth     (void)(A == B);
25*17773fcdSChandler Carruth   }
26*17773fcdSChandler Carruth };
27*17773fcdSChandler Carruth 
28*17773fcdSChandler Carruth template <int A> struct S4 {
fooS429*17773fcdSChandler Carruth   template <int B> void foo() {
30*17773fcdSChandler Carruth     (void)(A == A); // expected-warning {{self-comparison always evaluates to true}}
31*17773fcdSChandler Carruth     (void)(A == B);
32*17773fcdSChandler Carruth   }
33*17773fcdSChandler Carruth };
34*17773fcdSChandler Carruth 
35*17773fcdSChandler Carruth const int N = 42;
foo2()36*17773fcdSChandler Carruth template <int X> void foo2() {
37*17773fcdSChandler Carruth   (void)(X == N);
38*17773fcdSChandler Carruth   (void)(N == X);
39*17773fcdSChandler Carruth }
40*17773fcdSChandler Carruth 
test()41*17773fcdSChandler Carruth void test() {
42*17773fcdSChandler Carruth   foo<1, 1>();
43*17773fcdSChandler Carruth   S1<1, 1> s1; s1.foo();
44*17773fcdSChandler Carruth   S2<1, 1> s2; s2.foo<void>();
45*17773fcdSChandler Carruth   S3 s3; s3.foo<1, 1>();
46*17773fcdSChandler Carruth   S4<1> s4; s4.foo<1>();
47*17773fcdSChandler Carruth   foo2<N>();
48*17773fcdSChandler Carruth }
49