I'll correct them. /Eric
On Sat, Sep 16, 2017 at 6:28 PM, Richard Smith <rich...@metafoo.co.uk> wrote: > This is a bug in the libc++ tests. It's OK for them to check that the > static_assert message is produced, but not that they're prefixed with the > exact string "static_assert failed:". > > On 16 September 2017 at 05:54, NAKAMURA Takumi via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> This triggered failure in libcxx tests. >> http://bb.pgr.jp/builders/bootstrap-clang-libcxx-lld-i686-linux/builds/97 >> >> >> On Fri, Sep 15, 2017 at 8:40 AM Douglas Gregor via cfe-commits < >> cfe-commits@lists.llvm.org> wrote: >> >>> Author: dgregor >>> Date: Thu Sep 14 16:38:42 2017 >>> New Revision: 313315 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=313315&view=rev >>> Log: >>> Diagnostic specific failed condition in a static_assert. >>> >>> When a static_assert fails, dig out a specific condition to diagnose, >>> using the same logic that we use to find the enable_if condition to >>> diagnose. >>> >>> Modified: >>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >>> cfe/trunk/include/clang/Sema/Sema.h >>> cfe/trunk/lib/Sema/SemaDeclCXX.cpp >>> cfe/trunk/lib/Sema/SemaTemplate.cpp >>> cfe/trunk/test/SemaCXX/static-assert.cpp >>> >>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ >>> Basic/DiagnosticSemaKinds.td?rev=313315&r1=313314&r2=313315&view=diff >>> ============================================================ >>> ================== >>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) >>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Sep 14 >>> 16:38:42 2017 >>> @@ -1219,6 +1219,8 @@ def warn_messaging_unqualified_id : Warn >>> def err_static_assert_expression_is_not_constant : Error< >>> "static_assert expression is not an integral constant expression">; >>> def err_static_assert_failed : Error<"static_assert failed%select{ >>> %1|}0">; >>> +def err_static_assert_requirement_failed : Error< >>> + "static_assert failed due to requirement '%0'%select{ %2|}1">; >>> def ext_static_assert_no_message : ExtWarn< >>> "static_assert with no message is a C++17 extension">, InGroup<CXX17>; >>> def warn_cxx14_compat_static_assert_no_message : Warning< >>> >>> Modified: cfe/trunk/include/clang/Sema/Sema.h >>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ >>> Sema/Sema.h?rev=313315&r1=313314&r2=313315&view=diff >>> ============================================================ >>> ================== >>> --- cfe/trunk/include/clang/Sema/Sema.h (original) >>> +++ cfe/trunk/include/clang/Sema/Sema.h Thu Sep 14 16:38:42 2017 >>> @@ -2783,6 +2783,14 @@ public: >>> EnableIfAttr *CheckEnableIf(FunctionDecl *Function, ArrayRef<Expr *> >>> Args, >>> bool MissingImplicitThis = false); >>> >>> + /// Find the failed Boolean condition within a given Boolean >>> + /// constant expression, and describe it with a string. >>> + /// >>> + /// \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/SemaD >>> eclCXX.cpp?rev=313315&r1=313314&r2=313315&view=diff >>> ============================================================ >>> ================== >>> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) >>> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Sep 14 16:38:42 2017 >>> @@ -13296,8 +13296,20 @@ Decl *Sema::BuildStaticAssertDeclaration >>> llvm::raw_svector_ostream Msg(MsgBuffer); >>> if (AssertMessage) >>> AssertMessage->printPretty(Msg, nullptr, getPrintingPolicy()); >>> - Diag(StaticAssertLoc, diag::err_static_assert_failed) >>> - << !AssertMessage << Msg.str() << AssertExpr->getSourceRange(); >>> + >>> + Expr *InnerCond = nullptr; >>> + std::string InnerCondDescription; >>> + std::tie(InnerCond, InnerCondDescription) = >>> + findFailedBooleanCondition(Converted.get(), >>> + /*AllowTopLevelCond=*/false); >>> + if (InnerCond) { >>> + Diag(StaticAssertLoc, diag::err_static_assert_requir >>> ement_failed) >>> + << InnerCondDescription << !AssertMessage >>> + << Msg.str() << InnerCond->getSourceRange(); >>> + } else { >>> + Diag(StaticAssertLoc, diag::err_static_assert_failed) >>> + << !AssertMessage << Msg.str() << >>> AssertExpr->getSourceRange(); >>> + } >>> Failed = true; >>> } >>> } >>> >>> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp >>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaT >>> emplate.cpp?rev=313315&r1=313314&r2=313315&view=diff >>> ============================================================ >>> ================== >>> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original) >>> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Thu Sep 14 16:38:42 2017 >>> @@ -2863,11 +2863,9 @@ static Expr *lookThroughRangesV3Conditio >>> return Cond; >>> } >>> >>> -/// Find the failed subexpression within enable_if, and describe it >>> -/// with a string. >>> -static std::pair<Expr *, std::string> >>> -findFailedEnableIfCondition(Sema &S, Expr *Cond) { >>> - Cond = lookThroughRangesV3Condition(S.PP, Cond); >>> +std::pair<Expr *, std::string> >>> +Sema::findFailedBooleanCondition(Expr *Cond, bool AllowTopLevelCond) { >>> + Cond = lookThroughRangesV3Condition(PP, Cond); >>> >>> // Separate out all of the terms in a conjunction. >>> SmallVector<Expr *, 4> Terms; >>> @@ -2876,27 +2874,37 @@ findFailedEnableIfCondition(Sema &S, Exp >>> // Determine which term failed. >>> Expr *FailedCond = nullptr; >>> 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( >>> - S, Sema::ExpressionEvaluationContext::ConstantEvaluated); >>> + *this, Sema::ExpressionEvaluationContext::ConstantEvaluated); >>> >>> bool Succeeded; >>> - if (Term->EvaluateAsBooleanCondition(Succeeded, S.Context) && >>> + if (Term->EvaluateAsBooleanCondition(Succeeded, Context) && >>> !Succeeded) { >>> - FailedCond = Term->IgnoreParenImpCasts(); >>> + FailedCond = TermAsWritten; >>> break; >>> } >>> } >>> >>> - if (!FailedCond) >>> + if (!FailedCond) { >>> + if (!AllowTopLevelCond) >>> + return { nullptr, "" }; >>> + >>> FailedCond = Cond->IgnoreParenImpCasts(); >>> + } >>> >>> std::string Description; >>> { >>> llvm::raw_string_ostream Out(Description); >>> - FailedCond->printPretty(Out, nullptr, >>> - PrintingPolicy(S.Context.getLangOpts())); >>> + FailedCond->printPretty(Out, nullptr, getPrintingPolicy()); >>> } >>> return { FailedCond, Description }; >>> } >>> @@ -2980,8 +2988,9 @@ QualType Sema::CheckTemplateIdType(Templ >>> Expr *FailedCond; >>> std::string FailedDescription; >>> std::tie(FailedCond, FailedDescription) = >>> - findFailedEnableIfCondition( >>> - *this, TemplateArgs[0].getSourceExpression()); >>> + findFailedBooleanCondition( >>> + TemplateArgs[0].getSourceExpression(), >>> + /*AllowTopLevelCond=*/true); >>> >>> // Remove the old SFINAE diagnostic. >>> PartialDiagnosticAt OldDiag = >>> @@ -9513,7 +9522,7 @@ Sema::CheckTypenameType(ElaboratedTypeKe >>> Expr *FailedCond; >>> std::string FailedDescription; >>> std::tie(FailedCond, FailedDescription) = >>> - findFailedEnableIfCondition(*this, Cond); >>> + findFailedBooleanCondition(Cond, /*AllowTopLevelCond=*/true); >>> >>> Diag(FailedCond->getExprLoc(), >>> diag::err_typename_nested_not_found_requirement) >>> >>> Modified: cfe/trunk/test/SemaCXX/static-assert.cpp >>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/ >>> static-assert.cpp?rev=313315&r1=313314&r2=313315&view=diff >>> ============================================================ >>> ================== >>> --- cfe/trunk/test/SemaCXX/static-assert.cpp (original) >>> +++ cfe/trunk/test/SemaCXX/static-assert.cpp Thu Sep 14 16:38:42 2017 >>> @@ -51,3 +51,20 @@ StaticAssertProtected<X> sap2; // expect >>> >>> static_assert(true); // expected-warning {{C++17 extension}} >>> static_assert(false); // expected-error-re {{failed{{$}}}} >>> expected-warning {{extension}} >>> + >>> + >>> +// Diagnostics for static_assert with multiple conditions >>> +template<typename T> struct first_trait { >>> + static const bool value = false; >>> +}; >>> + >>> +template<> >>> +struct first_trait<X> { >>> + static const bool value = true; >>> +}; >>> + >>> +template<typename T> struct second_trait { >>> + static const bool value = false; >>> +}; >>> + >>> +static_assert(first_trait<X>::value && second_trait<X>::value, >>> "message"); // expected-error{{static_assert failed due to requirement >>> 'second_trait<X>::value' "message"}} >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits