Author: courbet
Date: Mon Dec 10 00:53:17 2018
New Revision: 348742

URL: http://llvm.org/viewvc/llvm-project?rev=348742&view=rev
Log:
Revert r348741 "[Sema] Further improvements to to static_assert diagnostics."

Seems to break build bots.

Modified:
    cfe/trunk/include/clang/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/lib/Sema/SemaTemplate.cpp
    cfe/trunk/test/PCH/cxx-static_assert.cpp
    cfe/trunk/test/Sema/static-assert.c
    cfe/trunk/test/SemaCXX/static-assert-cxx17.cpp
    cfe/trunk/test/SemaCXX/static-assert.cpp

Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=348742&r1=348741&r2=348742&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Mon Dec 10 00:53:17 2018
@@ -2861,7 +2861,11 @@ public:
 
   /// Find the failed Boolean condition within a given Boolean
   /// constant expression, and describe it with a string.
-  std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
+  ///
+  /// \param AllowTopLevelCond Whether to allow the result to be the
+  /// complete top-level condition.
+  std::pair<Expr *, std::string>
+  findFailedBooleanCondition(Expr *Cond, bool AllowTopLevelCond);
 
   /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
   /// non-ArgDependent DiagnoseIfAttrs.

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=348742&r1=348741&r2=348742&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Dec 10 00:53:17 2018
@@ -13878,7 +13878,8 @@ Decl *Sema::BuildStaticAssertDeclaration
       Expr *InnerCond = nullptr;
       std::string InnerCondDescription;
       std::tie(InnerCond, InnerCondDescription) =
-        findFailedBooleanCondition(Converted.get());
+        findFailedBooleanCondition(Converted.get(),
+                                   /*AllowTopLevelCond=*/false);
       if (InnerCond) {
         Diag(StaticAssertLoc, diag::err_static_assert_requirement_failed)
           << InnerCondDescription << !AssertMessage

Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=348742&r1=348741&r2=348742&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Mon Dec 10 00:53:17 2018
@@ -3052,42 +3052,30 @@ static Expr *lookThroughRangesV3Conditio
   return Cond;
 }
 
-namespace {
-
-// A PrinterHelper that prints more helpful diagnostics for some 
sub-expressions
-// within failing boolean expression, such as substituting template parameters
-// for actual types.
-class FailedBooleanConditionPrinterHelper : public PrinterHelper {
-public:
-  explicit FailedBooleanConditionPrinterHelper(const PrintingPolicy &Policy)
-      : Policy(Policy) {}
-
-  bool handledStmt(Stmt *E, raw_ostream &OS) override {
-    const auto *DR = dyn_cast<DeclRefExpr>(E);
-    if (DR && DR->getQualifier()) {
-      // If this is a qualified name, expand the template arguments in nested
-      // qualifiers.
-      DR->getQualifier()->print(OS, Policy, true);
-      // Then print the decl itself.
-      const ValueDecl *VD = DR->getDecl();
-      OS << VD->getName();
-      if (const auto *IV = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
-        // This is a template variable, print the expanded template arguments.
-        printTemplateArgumentList(OS, IV->getTemplateArgs().asArray(), Policy);
-      }
-      return true;
+// Print a diagnostic for the failing static_assert expression. Defaults to
+// pretty-printing the expression.
+static void prettyPrintFailedBooleanCondition(llvm::raw_string_ostream &OS,
+                                              const Expr *FailedCond,
+                                              const PrintingPolicy &Policy) {
+  const auto *DR = dyn_cast<DeclRefExpr>(FailedCond);
+  if (DR && DR->getQualifier()) {
+    // If this is a qualified name, expand the template arguments in nested
+    // qualifiers.
+    DR->getQualifier()->print(OS, Policy, true);
+    // Then print the decl itself.
+    const ValueDecl *VD = DR->getDecl();
+    OS << VD->getName();
+    if (const auto *IV = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
+      // This is a template variable, print the expanded template arguments.
+      printTemplateArgumentList(OS, IV->getTemplateArgs().asArray(), Policy);
     }
-    return false;
+    return;
   }
-
-private:
-  const PrintingPolicy &Policy;
-};
-
-} // end anonymous namespace
+  FailedCond->printPretty(OS, nullptr, Policy);
+}
 
 std::pair<Expr *, std::string>
-Sema::findFailedBooleanCondition(Expr *Cond) {
+Sema::findFailedBooleanCondition(Expr *Cond, bool AllowTopLevelCond) {
   Cond = lookThroughRangesV3Condition(PP, Cond);
 
   // Separate out all of the terms in a conjunction.
@@ -3099,6 +3087,11 @@ Sema::findFailedBooleanCondition(Expr *C
   for (Expr *Term : Terms) {
     Expr *TermAsWritten = Term->IgnoreParenImpCasts();
 
+    // Literals are uninteresting.
+    if (isa<CXXBoolLiteralExpr>(TermAsWritten) ||
+        isa<IntegerLiteral>(TermAsWritten))
+      continue;
+
     // The initialization of the parameter from the argument is
     // a constant-evaluated context.
     EnterExpressionEvaluationContext ConstantEvaluated(
@@ -3111,18 +3104,18 @@ Sema::findFailedBooleanCondition(Expr *C
       break;
     }
   }
-  if (!FailedCond)
-    FailedCond = Cond->IgnoreParenImpCasts();
 
-  // Literals are uninteresting.
-  if (isa<CXXBoolLiteralExpr>(FailedCond) || isa<IntegerLiteral>(FailedCond))
-    return {nullptr, ""};
+  if (!FailedCond) {
+    if (!AllowTopLevelCond)
+      return { nullptr, "" };
+
+    FailedCond = Cond->IgnoreParenImpCasts();
+  }
 
   std::string Description;
   {
     llvm::raw_string_ostream Out(Description);
-    FailedBooleanConditionPrinterHelper Helper(getPrintingPolicy());
-    FailedCond->printPretty(Out, &Helper, getPrintingPolicy());
+    prettyPrintFailedBooleanCondition(Out, FailedCond, getPrintingPolicy());
   }
   return { FailedCond, Description };
 }
@@ -3206,7 +3199,9 @@ QualType Sema::CheckTemplateIdType(Templ
             Expr *FailedCond;
             std::string FailedDescription;
             std::tie(FailedCond, FailedDescription) =
-              
findFailedBooleanCondition(TemplateArgs[0].getSourceExpression());
+              findFailedBooleanCondition(
+                TemplateArgs[0].getSourceExpression(),
+                /*AllowTopLevelCond=*/true);
 
             // Remove the old SFINAE diagnostic.
             PartialDiagnosticAt OldDiag =
@@ -9654,7 +9649,7 @@ Sema::CheckTypenameType(ElaboratedTypeKe
         Expr *FailedCond;
         std::string FailedDescription;
         std::tie(FailedCond, FailedDescription) =
-          findFailedBooleanCondition(Cond);
+          findFailedBooleanCondition(Cond, /*AllowTopLevelCond=*/true);
 
         Diag(FailedCond->getExprLoc(),
              diag::err_typename_nested_not_found_requirement)

Modified: cfe/trunk/test/PCH/cxx-static_assert.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/cxx-static_assert.cpp?rev=348742&r1=348741&r2=348742&view=diff
==============================================================================
--- cfe/trunk/test/PCH/cxx-static_assert.cpp (original)
+++ cfe/trunk/test/PCH/cxx-static_assert.cpp Mon Dec 10 00:53:17 2018
@@ -3,7 +3,7 @@
 
 // Test with pch.
 // RUN: %clang_cc1 -std=c++11 -emit-pch -o %t %s
-// RUN: %clang_cc1 -include-pch %t -verify -std=c++11 %s
+// RUN: %clang_cc1 -include-pch %t -verify -std=c++11 %s 
 
 #ifndef HEADER
 #define HEADER
@@ -14,7 +14,7 @@ template<int N> struct T {
 
 #else
 
-// expected-error@12 {{static_assert failed due to requirement '1 == 2' "N is 
not 2!"}}
+// expected-error@12 {{static_assert failed "N is not 2!"}}
 T<1> t1; // expected-note {{in instantiation of template class 'T<1>' 
requested here}}
 T<2> t2;
 

Modified: cfe/trunk/test/Sema/static-assert.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/static-assert.c?rev=348742&r1=348741&r2=348742&view=diff
==============================================================================
--- cfe/trunk/test/Sema/static-assert.c (original)
+++ cfe/trunk/test/Sema/static-assert.c Mon Dec 10 00:53:17 2018
@@ -38,5 +38,5 @@ struct A {
 
 typedef UNION(unsigned, struct A) U1;
 UNION(char[2], short) u2 = { .one = { 'a', 'b' } };
-typedef UNION(char, short) U3; // expected-error {{static_assert failed due to 
requirement 'sizeof(char) == sizeof(short)' "type size mismatch"}}
+typedef UNION(char, short) U3; // expected-error {{static_assert failed "type 
size mismatch"}}
 typedef UNION(float, 0.5f) U4; // expected-error {{expected a type}}

Modified: cfe/trunk/test/SemaCXX/static-assert-cxx17.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/static-assert-cxx17.cpp?rev=348742&r1=348741&r2=348742&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/static-assert-cxx17.cpp (original)
+++ cfe/trunk/test/SemaCXX/static-assert-cxx17.cpp Mon Dec 10 00:53:17 2018
@@ -45,12 +45,3 @@ void foo4() {
 };
 template void foo4<float>();
 // expected-note@-1{{in instantiation of function template specialization 
'foo4<float>' requested here}}
-
-
-template <typename U, typename V>
-void foo5() {
-  static_assert(!!(global_inline_var<U, V>));
-  // expected-error@-1{{static_assert failed due to requirement 
'!!(global_inline_var<int, float>)'}}
-}
-template void foo5<int, float>();
-// expected-note@-1{{in instantiation of function template specialization 
'foo5<int, float>' requested here}}

Modified: cfe/trunk/test/SemaCXX/static-assert.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/static-assert.cpp?rev=348742&r1=348741&r2=348742&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/static-assert.cpp (original)
+++ cfe/trunk/test/SemaCXX/static-assert.cpp Mon Dec 10 00:53:17 2018
@@ -15,14 +15,14 @@ class C {
 };
 
 template<int N> struct T {
-    static_assert(N == 2, "N is not 2!"); // expected-error {{static_assert 
failed due to requirement '1 == 2' "N is not 2!"}}
+    static_assert(N == 2, "N is not 2!"); // expected-error {{static_assert 
failed "N is not 2!"}}
 };
 
 T<1> t1; // expected-note {{in instantiation of template class 'T<1>' 
requested here}}
 T<2> t2;
 
 template<typename T> struct S {
-    static_assert(sizeof(T) > sizeof(char), "Type not big enough!"); // 
expected-error {{static_assert failed due to requirement 'sizeof(char) > 
sizeof(char)' "Type not big enough!"}}
+    static_assert(sizeof(T) > sizeof(char), "Type not big enough!"); // 
expected-error {{static_assert failed "Type not big enough!"}}
 };
 
 S<char> s1; // expected-note {{in instantiation of template class 'S<char>' 
requested here}}
@@ -111,14 +111,6 @@ static_assert(std::is_same<ExampleTypes:
 // expected-error@-1{{static_assert failed due to requirement 
'std::is_same<int, float>::value' "message"}}
 static_assert(std::is_const<ExampleTypes::T>::value, "message");
 // expected-error@-1{{static_assert failed due to requirement 
'std::is_const<int>::value' "message"}}
-static_assert(!std::is_const<const ExampleTypes::T>::value, "message");
-// expected-error@-1{{static_assert failed due to requirement 
'!std::is_const<const int>::value' "message"}}
-static_assert(!(std::is_const<const ExampleTypes::T>::value), "message");
-// expected-error@-1{{static_assert failed due to requirement 
'!(std::is_const<const int>::value)' "message"}}
-static_assert(std::is_const<const ExampleTypes::T>::value == false, "message");
-// expected-error@-1{{static_assert failed due to requirement 
'std::is_const<const int>::value == false' "message"}}
-static_assert(!(std::is_const<const ExampleTypes::T>::value == true), 
"message");
-// expected-error@-1{{static_assert failed due to requirement 
'!(std::is_const<const int>::value == true)' "message"}}
 
 struct BI_tag {};
 struct RAI_tag : BI_tag {};


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to