P0217R3: Constant expression evaluation for decomposition declarations.

llvm-svn: 278447
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 4a68d60..6445dac 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -6107,9 +6107,12 @@
       NewVD = cast<VarDecl>(Res.get());
       AddToScope = false;
     } else if (D.isDecompositionDeclarator()) {
-      NewVD = DecompositionDecl::Create(Context, DC, D.getLocStart(),
-                                        D.getIdentifierLoc(), R, TInfo, SC,
-                                        Bindings);
+      auto *NewDD = DecompositionDecl::Create(Context, DC, D.getLocStart(),
+                                              D.getIdentifierLoc(), R, TInfo,
+                                              SC, Bindings);
+      for (auto *B : Bindings)
+        B->setDecompositionDecl(NewDD);
+      NewVD = NewDD;
     } else
       NewVD = VarDecl::Create(Context, DC, D.getLocStart(),
                               D.getIdentifierLoc(), II, R, TInfo, SC);
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index fc593be..cecbee1 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -791,7 +791,7 @@
       Diag(Old->getLocation(), diag::note_previous_definition);
     }
 
-    auto *BD = BindingDecl::Create(Context, DC, B.NameLoc, B.Name);
+    auto *BD = BindingDecl::Create(Context, DC, nullptr, B.NameLoc, B.Name);
     PushOnScopeChains(BD, S, true);
     Bindings.push_back(BD);
     ParsingInitForAutoVars.insert(BD);
@@ -1660,7 +1660,8 @@
       // C++11 and permitted in C++1y, so ignore them.
       continue;
 
-    case Decl::Var: {
+    case Decl::Var:
+    case Decl::Decomposition: {
       // C++1y [dcl.constexpr]p3 allows anything except:
       //   a definition of a variable of non-literal type or of static or
       //   thread storage duration or for which no initialization is performed.
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 208afa6..5c8aa72 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -599,7 +599,13 @@
 }
 
 Decl *TemplateDeclInstantiator::VisitBindingDecl(BindingDecl *D) {
-  return BindingDecl::Create(SemaRef.Context, Owner, D->getLocation(),
+  auto *NewDD =
+      dyn_cast_or_null<DecompositionDecl>(SemaRef.FindInstantiatedDecl(
+          D->getLocation(), D->getDecompositionDecl(), TemplateArgs));
+  if (!NewDD)
+    return nullptr;
+
+  return BindingDecl::Create(SemaRef.Context, Owner, NewDD, D->getLocation(),
                              D->getIdentifier());
 }