Change the other -Wtautological-compare warnings to not trigger in template

specializations.  Also switch to -Wuninitialized for a test case that depended
on a warning firing in template specializations.

llvm-svn: 193906
This commit is contained in:
Richard Trieu 2013-11-02 02:11:23 +00:00
parent e4aaa335dd
commit 30bfa3623b
3 changed files with 29 additions and 9 deletions

View 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

View 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}}
}
};

View 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>();
}
}