r321977 - Remove bogus check for template specialization from self-comparison warning.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 7 14:25:55 PST 2018
Author: rsmith
Date: Sun Jan 7 14:25:55 2018
New Revision: 321977
URL: http://llvm.org/viewvc/llvm-project?rev=321977&view=rev
Log:
Remove bogus check for template specialization from self-comparison warning.
The important check is that we're not within a template *instantiation*, which
we check separately.
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
cfe/trunk/test/SemaCXX/self-comparison.cpp
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=321977&r1=321976&r2=321977&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Sun Jan 7 14:25:55 2018
@@ -9300,16 +9300,6 @@ QualType Sema::CheckShiftOperands(ExprRe
return LHSType;
}
-static bool IsWithinTemplateSpecialization(Decl *D) {
- if (DeclContext *DC = D->getDeclContext()) {
- if (isa<ClassTemplateSpecializationDecl>(DC))
- return true;
- if (FunctionDecl *FD = dyn_cast<FunctionDecl>(DC))
- return FD->isFunctionTemplateSpecialization();
- }
- return false;
-}
-
/// If two different enums are compared, raise a warning.
static void checkEnumComparison(Sema &S, SourceLocation Loc, Expr *LHS,
Expr *RHS) {
@@ -9621,14 +9611,13 @@ static void diagnoseTautologicalComparis
//
// NOTE: Don't warn about comparison expressions resulting from macro
// expansion. Also don't warn about comparisons which are only self
- // comparisons within a template specialization. The warnings should catch
+ // comparisons within a template instantiation. The warnings should catch
// obvious cases in the definition of the template anyways. The idea is to
// warn when the typed comparison operator will always evaluate to the same
// result.
ValueDecl *DL = getCompareDecl(LHSStripped);
ValueDecl *DR = getCompareDecl(RHSStripped);
- if (DL && DR && declaresSameEntity(DL, DR) &&
- !IsWithinTemplateSpecialization(DL)) {
+ if (DL && DR && declaresSameEntity(DL, DR)) {
StringRef Result;
switch (Opc) {
case BO_EQ: case BO_LE: case BO_GE:
Modified: cfe/trunk/test/SemaCXX/self-comparison.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/self-comparison.cpp?rev=321977&r1=321976&r2=321977&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/self-comparison.cpp (original)
+++ cfe/trunk/test/SemaCXX/self-comparison.cpp Sun Jan 7 14:25:55 2018
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++2a
int foo(int x) {
return x == x; // expected-warning {{self-comparison always evaluates to true}}
@@ -25,3 +25,18 @@ struct A {
namespace NA { extern "C" int x[3]; }
namespace NB { extern "C" int x[3]; }
bool k = NA::x == NB::x; // expected-warning {{self-comparison always evaluates to true}}
+
+template<typename T> struct Y { static inline int n; };
+bool f() {
+ return
+ Y<int>::n == Y<int>::n || // expected-warning {{self-comparison always evaluates to true}}
+ Y<void>::n == Y<int>::n;
+}
+template<typename T, typename U>
+bool g() {
+ // FIXME: Ideally we'd produce a self-comparison warning on the first of these.
+ return
+ Y<T>::n == Y<T>::n ||
+ Y<T>::n == Y<U>::n;
+}
+template bool g<int, int>(); // should not produce any warnings
More information about the cfe-commits
mailing list