// RUN: %clang_cc1 -fsyntax-only -verify %s template <int A, int B> void foo() { (void)(A == A); // expected-warning {{self-comparison always evaluates to true}} (void)(A == B); } template <int A, int B> struct S1 { void foo() { (void)(A == A); // expected-warning {{self-comparison always evaluates to true}} (void)(A == B); } }; template <int A, int B> struct S2 { template <typename T> T foo() { (void)(A == A); // expected-warning {{self-comparison always evaluates to true}} (void)(A == B); } }; struct S3 { template <int A, int B> void foo() { (void)(A == A); // expected-warning {{self-comparison always evaluates to true}} (void)(A == B); } }; template <int A> struct S4 { template <int B> void foo() { (void)(A == A); // expected-warning {{self-comparison always evaluates to true}} (void)(A == B); } }; const int N = 42; template <int X> void foo2() { (void)(X == N); (void)(N == X); } void test() { foo<1, 1>(); S1<1, 1> s1; s1.foo(); S2<1, 1> s2; s2.foo<void>(); S3 s3; s3.foo<1, 1>(); S4<1> s4; s4.foo<1>(); foo2<N>(); }