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