r338467 - Avoid exposing name for range-based for '__range' variables in lifetime warnings.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 7 14:35:24 PDT 2018


There's definitely scope for improving this diagnostic text further. Right
now I don't think there's an easy way to figure out that the variable is
the range variable in a range-based for loop, but I think that case is
common enough that that's the level of special-case we should be looking at
here. If we track that state, something like "error: range refers to a
temporary object that will be destroyed before the first iteration of the
loop" would seem much preferable.

On Tue, 7 Aug 2018 at 09:28, David Blaikie via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Reckon there's a chance of improved diagnostic text in cases like this?
> Will users understand what the problem is/how to fix it when they read "temporary
> implicitly bound to local reference will be destroyed at the end of the
> full-expression" - feels very standard-ese-y to me? & I appreciate teh
> desire/need for precision, I wonder if there's better ways to communicate
> it to the user... :/
>
> On Tue, Jul 31, 2018 at 6:03 PM Richard Smith via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: rsmith
>> Date: Tue Jul 31 18:03:33 2018
>> New Revision: 338467
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=338467&view=rev
>> Log:
>> Avoid exposing name for range-based for '__range' variables in lifetime
>> warnings.
>>
>> Modified:
>>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>     cfe/trunk/lib/Sema/SemaInit.cpp
>>     cfe/trunk/test/SemaCXX/attr-lifetimebound.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=338467&r1=338466&r2=338467&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Jul 31
>> 18:03:33 2018
>> @@ -7875,7 +7875,8 @@ def warn_ret_addr_label : Warning<
>>  def err_ret_local_block : Error<
>>    "returning block that lives on the local stack">;
>>  def note_local_var_initializer : Note<
>> -  "%select{via initialization of|binding reference}0 variable %1 here">;
>> +  "%select{via initialization of|binding reference}0 variable "
>> +  "%select{%2 |}1here">;
>>  def note_init_with_default_member_initalizer : Note<
>>    "initializing field %0 with default member initializer">;
>>
>> @@ -7907,13 +7908,14 @@ def note_lifetime_extending_member_decla
>>    "member with %select{reference|'std::initializer_list'}0 subobject}1 "
>>    "declared here">;
>>  def warn_dangling_variable : Warning<
>> -  "%select{temporary %select{whose address is used as value of|bound
>> to}3 "
>> -  "%select{%select{|reference }3member of local variable|"
>> -  "local %select{variable|reference}3}1|"
>> +  "%select{temporary %select{whose address is used as value of|"
>> +  "%select{|implicitly }2bound to}4 "
>> +  "%select{%select{|reference }4member of local variable|"
>> +  "local %select{variable|reference}4}1|"
>>    "array backing "
>>    "%select{initializer list subobject of local variable|"
>>    "local initializer list}1}0 "
>> -  "%2 will be destroyed at the end of the full-expression">,
>> +  "%select{%3 |}2will be destroyed at the end of the full-expression">,
>>    InGroup<Dangling>;
>>  def warn_new_dangling_reference : Warning<
>>    "temporary bound to reference member of allocated object "
>>
>> Modified: cfe/trunk/lib/Sema/SemaInit.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=338467&r1=338466&r2=338467&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaInit.cpp Tue Jul 31 18:03:33 2018
>> @@ -6847,8 +6847,9 @@ void Sema::checkInitializerLifetime(cons
>>            return false;
>>
>>          Diag(DiagLoc, diag::warn_dangling_variable)
>> -            << RK << !Entity.getParent() << ExtendingEntity->getDecl()
>> -            << Init->isGLValue() << DiagRange;
>> +            << RK << !Entity.getParent()
>> +            << ExtendingEntity->getDecl()->isImplicit()
>> +            << ExtendingEntity->getDecl() << Init->isGLValue() <<
>> DiagRange;
>>        }
>>        break;
>>      }
>> @@ -6969,7 +6970,8 @@ void Sema::checkInitializerLifetime(cons
>>        case IndirectLocalPathEntry::VarInit:
>>          const VarDecl *VD = cast<VarDecl>(Elem.D);
>>          Diag(VD->getLocation(), diag::note_local_var_initializer)
>> -            << VD->getType()->isReferenceType() << VD->getDeclName()
>> +            << VD->getType()->isReferenceType()
>> +            << VD->isImplicit() << VD->getDeclName()
>>              << nextPathEntryRange(Path, I + 1, L);
>>          break;
>>        }
>>
>> Modified: cfe/trunk/test/SemaCXX/attr-lifetimebound.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-lifetimebound.cpp?rev=338467&r1=338466&r2=338467&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/SemaCXX/attr-lifetimebound.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/attr-lifetimebound.cpp Tue Jul 31 18:03:33 2018
>> @@ -101,7 +101,7 @@ namespace p0936r0_examples {
>>    std::vector make_vector();
>>    void use_reversed_range() {
>>      // FIXME: Don't expose the name of the internal range variable.
>> -    for (auto x : reversed(make_vector())) {} // expected-warning
>> {{temporary bound to local reference '__range1'}}
>> +    for (auto x : reversed(make_vector())) {} // expected-warning
>> {{temporary implicitly bound to local reference will be destroyed at the
>> end of the full-expression}}
>>    }
>>
>>    template <typename K, typename V>
>>
>>
>> _______________________________________________
>> 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/20180807/44d5e7c2/attachment.html>


More information about the cfe-commits mailing list