r286630 - When a DecompositionDecl is marked invalid, also set the child BindingDecl's to

Richard Trieu via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 11 13:33:57 PST 2016


I didn't see anything when making this patch, but I will go take a closer
look now.

On Fri, Nov 11, 2016 at 1:19 PM, Richard Smith <richard at metafoo.co.uk>
wrote:

> Thanks. We have some code in SemaDecl(CXX?) that was trying to do the same
> thing; can it be removed now?
>
> On 11 Nov 2016 1:00 pm, "Richard Trieu via cfe-commits" <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: rtrieu
>> Date: Fri Nov 11 14:51:04 2016
>> New Revision: 286630
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=286630&view=rev
>> Log:
>> When a DecompositionDecl is marked invalid, also set the child
>> BindingDecl's to
>> invalid.
>>
>> Modified:
>>     cfe/trunk/lib/AST/DeclBase.cpp
>>     cfe/trunk/test/SemaCXX/cxx1z-decomposition.cpp
>>
>> Modified: cfe/trunk/lib/AST/DeclBase.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBa
>> se.cpp?rev=286630&r1=286629&r2=286630&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/AST/DeclBase.cpp (original)
>> +++ cfe/trunk/lib/AST/DeclBase.cpp Fri Nov 11 14:51:04 2016
>> @@ -109,12 +109,24 @@ const char *Decl::getDeclKindName() cons
>>  void Decl::setInvalidDecl(bool Invalid) {
>>    InvalidDecl = Invalid;
>>    assert(!isa<TagDecl>(this) || !cast<TagDecl>(this)->isComple
>> teDefinition());
>> -  if (Invalid && !isa<ParmVarDecl>(this)) {
>> +  if (!Invalid) {
>> +    return;
>> +  }
>> +
>> +  if (!isa<ParmVarDecl>(this)) {
>>      // Defensive maneuver for ill-formed code: we're likely not to make
>> it to
>>      // a point where we set the access specifier, so default it to
>> "public"
>>      // to avoid triggering asserts elsewhere in the front end.
>>      setAccess(AS_public);
>>    }
>> +
>> +  // Marking a DecompositionDecl as invalid implies all the child
>> BindingDecl's
>> +  // are invalid too.
>> +  if (DecompositionDecl *DD = dyn_cast<DecompositionDecl>(this)) {
>> +    for (BindingDecl *Binding : DD->bindings()) {
>> +      Binding->setInvalidDecl();
>> +    }
>> +  }
>>  }
>>
>>  const char *DeclContext::getDeclKindName() const {
>>
>> Modified: cfe/trunk/test/SemaCXX/cxx1z-decomposition.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/
>> cxx1z-decomposition.cpp?rev=286630&r1=286629&r2=286630&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/test/SemaCXX/cxx1z-decomposition.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/cxx1z-decomposition.cpp Fri Nov 11 14:51:04
>> 2016
>> @@ -53,4 +53,16 @@ void bitfield() {
>>    auto &[p, q, r] = a; // expected-error {{decomposes into 2 elements,
>> but 3 names were provided}}
>>  }
>>
>> +void for_range() {
>> +  int x = 1;
>> +  for (auto[a, b] : x) { // expected-error {{invalid range expression of
>> type 'int'; no viable 'begin' function available}}
>> +    a++;
>> +  }
>> +
>> +  int y[5];
>> +  for (auto[c] : y) { // expected-error {{cannot decompose non-class,
>> non-array type 'int'}}
>> +    c++;
>> +  }
>> +}
>> +
>>  // FIXME: by-value array copies
>>
>>
>> _______________________________________________
>> 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/20161111/f87894c3/attachment.html>


More information about the cfe-commits mailing list