r313315 - Diagnostic specific failed condition in a static_assert.
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Sun Sep 17 13:58:55 PDT 2017
Fixed in r313499.
/Eric
On Sun, Sep 17, 2017 at 2:04 PM, Eric Fiselier <eric at efcs.ca> wrote:
> I'll correct them.
>
> /Eric
>
> On Sat, Sep 16, 2017 at 6:28 PM, Richard Smith <richard at 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 at lists.llvm.org> wrote:
>>
>>> This triggered failure in libcxx tests.
>>> http://bb.pgr.jp/builders/bootstrap-clang-libcxx-lld-i686-li
>>> nux/builds/97
>>>
>>>
>>> On Fri, Sep 15, 2017 at 8:40 AM Douglas Gregor via cfe-commits <
>>> cfe-commits at 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/s
>>>> tatic-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 at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170917/24ae25f8/attachment-0001.html>
More information about the cfe-commits
mailing list