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