]> granicus.if.org Git - clang/commitdiff
Change the other -Wtautological-compare warnings to not trigger in template
authorRichard Trieu <rtrieu@google.com>
Sat, 2 Nov 2013 02:11:23 +0000 (02:11 +0000)
committerRichard Trieu <rtrieu@google.com>
Sat, 2 Nov 2013 02:11:23 +0000 (02:11 +0000)
specializations.  Also switch to -Wuninitialized for a test case that depended
on a warning firing in template specializations.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193906 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/PCH/pragma-diag-section.cpp
test/SemaCXX/compare.cpp

index 77cf986351dd5ea0c992e83fe52464db9034afdf..edae0147d50514581b7c122651f63450de131f65 100644 (file)
@@ -7665,7 +7665,8 @@ QualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS,
   if (!LHSType->hasFloatingRepresentation() &&
       !(LHSType->isBlockPointerType() && IsRelational) &&
       !LHS.get()->getLocStart().isMacroID() &&
-      !RHS.get()->getLocStart().isMacroID()) {
+      !RHS.get()->getLocStart().isMacroID() &&
+      ActiveTemplateInstantiations.empty()) {
     // For non-floating point types, check for self-comparisons of the form
     // x == x, x != x, x < x, etc.  These always evaluate to a constant, and
     // often indicate logic errors in the program.
@@ -8051,7 +8052,8 @@ QualType Sema::CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS,
   // For non-floating point types, check for self-comparisons of the form
   // x == x, x != x, x < x, etc.  These always evaluate to a constant, and
   // often indicate logic errors in the program.
-  if (!LHSType->hasFloatingRepresentation()) {
+  if (!LHSType->hasFloatingRepresentation() &&
+      ActiveTemplateInstantiations.empty()) {
     if (DeclRefExpr* DRL
           = dyn_cast<DeclRefExpr>(LHS.get()->IgnoreParenImpCasts()))
       if (DeclRefExpr* DRR
index 627156f153986a4cae6ffa5202a385b48fd4e82c..eea6bd73f5465475036bb6782f5bd6b3a8f8e24d 100644 (file)
@@ -1,20 +1,20 @@
 // Test this without pch.
-// RUN: %clang_cc1 %s -include %s -verify -fsyntax-only
+// RUN: %clang_cc1 %s -include %s -verify -fsyntax-only -Wuninitialized
 
 // Test with pch.
 // RUN: %clang_cc1 %s -emit-pch -o %t
-// RUN: %clang_cc1 %s -include-pch %t -verify -fsyntax-only
+// RUN: %clang_cc1 %s -include-pch %t -verify -fsyntax-only -Wuninitialized
 
 #ifndef HEADER
 #define HEADER
 
 #pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wtautological-compare"
+#pragma clang diagnostic ignored "-Wuninitialized"
 template <typename T>
 struct TS1 {
     void m() {
-      T a = 0;
-      T b = a==a;
+      T a;
+      T b = a;
     }
 };
 #pragma clang diagnostic pop
@@ -25,8 +25,10 @@ struct TS1 {
 template <typename T>
 struct TS2 {
     void m() {
-      T a = 0;
-      T b = a==a; // expected-warning {{self-comparison always evaluates to true}} expected-note@39 {{in instantiation of member function}}
+      T a;
+      T b = a; // expected-warning {{variable 'a' is uninitialized}} \
+                  expected-note@41 {{in instantiation of member function}} \
+                  expected-note@28 {{initialize the variable 'a' to silence}}
     }
 };
 
index 02b029a7762fadf0e6360051872bd80dd33b8304..8214f7899ecfc03c3cfee9c8e89967de22d0318e 100644 (file)
@@ -405,4 +405,20 @@ namespace templates {
   void test12() {
     compare<0>(42);
   }
+
+  struct A { static int x; };
+  struct B { static int x; };
+  typedef A otherA;
+
+  template <typename T>
+  void testx() {
+    if (A::x == T::x &&  // no warning
+        A::x == otherA::x)  // expected-warning{{self-comparison always evaluates to true}}
+      return;
+  }
+
+  void test13() {
+    testx<A>();
+    testx<B>();
+  }
 }