diff options
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 41fcffd8cc0..6193cd0eac2 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1067,7 +1067,7 @@ struct BindingDiagnosticTrap { static bool checkTupleLikeDecomposition(Sema &S, ArrayRef<BindingDecl *> Bindings, - ValueDecl *Src, QualType DecompType, + VarDecl *Src, QualType DecompType, llvm::APSInt TupleSize) { if ((int64_t)Bindings.size() != TupleSize) { S.Diag(Src->getLocation(), diag::err_decomp_decl_wrong_number_bindings) @@ -1151,13 +1151,32 @@ static bool checkTupleLikeDecomposition(Sema &S, S.BuildReferenceType(T, E.get()->isLValue(), Loc, B->getDeclName()); if (RefType.isNull()) return true; - - InitializedEntity Entity = InitializedEntity::InitializeBinding(B, RefType); + auto *RefVD = VarDecl::Create( + S.Context, Src->getDeclContext(), Loc, Loc, + B->getDeclName().getAsIdentifierInfo(), RefType, + S.Context.getTrivialTypeSourceInfo(T, Loc), Src->getStorageClass()); + RefVD->setLexicalDeclContext(Src->getLexicalDeclContext()); + RefVD->setTSCSpec(Src->getTSCSpec()); + RefVD->setImplicit(); + if (Src->isInlineSpecified()) + RefVD->setInlineSpecified(); + + InitializedEntity Entity = InitializedEntity::InitializeBinding(RefVD); InitializationKind Kind = InitializationKind::CreateCopy(Loc, Loc); InitializationSequence Seq(S, Entity, Kind, Init); E = Seq.Perform(S, Entity, Kind, Init); if (E.isInvalid()) return true; + RefVD->setInit(E.get()); + RefVD->checkInitIsICE(); + + RefVD->getLexicalDeclContext()->addHiddenDecl(RefVD); + + E = S.BuildDeclarationNameExpr(CXXScopeSpec(), + DeclarationNameInfo(B->getDeclName(), Loc), + RefVD); + if (E.isInvalid()) + return true; B->setBinding(T, E.get()); I++; |

