summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2016-08-12 00:39:32 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2016-08-12 00:39:32 +0000
commitdca60b495822a869c08b9973e4c485a83e8b6c0e (patch)
tree2fdde29c41a18a0db2b21eee23a45ddf8a6fc75c /clang/lib/Sema
parente5cc668eb823dc8eb0e6013289846d25b6e82293 (diff)
downloadbcm5719-llvm-dca60b495822a869c08b9973e4c485a83e8b6c0e.tar.gz
bcm5719-llvm-dca60b495822a869c08b9973e4c485a83e8b6c0e.zip
P0217R3: Constant expression evaluation for decomposition declarations.
llvm-svn: 278447
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp9
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp5
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateDecl.cpp8
3 files changed, 16 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 4a68d60a1e2..6445dac7db0 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -6107,9 +6107,12 @@ NamedDecl *Sema::ActOnVariableDeclarator(
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 fc593be15b1..cecbee13eef 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -791,7 +791,7 @@ Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D,
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 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl,
// 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 208afa6de60..5c8aa7287ea 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -599,7 +599,13 @@ TemplateDeclInstantiator::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
}
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());
}
OpenPOWER on IntegriCloud