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