Thank you! Sent from my iPhone
> On Sep 17, 2017, at 1:58 PM, Eric Fiselier <e...@efcs.ca> wrote: > > Fixed in r313499. > > /Eric > >> On Sun, Sep 17, 2017 at 2:04 PM, Eric Fiselier <e...@efcs.ca> wrote: >> 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/SemaDeclCXX.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_requirement_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/SemaTemplate.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