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

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 11 13:46:31 PST 2016


Sema::FinalizeDeclaration contains the code I was thinking about.


On Fri, Nov 11, 2016 at 1:33 PM, Richard Trieu <rtrieu at google.com> wrote:

> 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/c
>>> xx1z-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/eb0cc39c/attachment.html>


More information about the cfe-commits mailing list