Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -513,18 +513,23 @@ QualType Ty; const ValueDecl *Key = nullptr; + const Expr *Init = nullptr; bool IsTemporary = false; - if (auto *VD = dyn_cast_or_null(Src.dyn_cast())) { + if (auto *VD = dyn_cast_if_present(Src.dyn_cast())) { Key = VD; Ty = VD->getType(); + + if (const auto *VarD = dyn_cast(VD)) + Init = VarD->getInit(); } if (auto *E = Src.dyn_cast()) { IsTemporary = true; Ty = E->getType(); } - Descriptor *D = P.createDescriptor(Src, Ty.getTypePtr(), - Ty.isConstQualified(), IsTemporary); + Descriptor *D = + P.createDescriptor(Src, Ty.getTypePtr(), Ty.isConstQualified(), + IsTemporary, /*IsMutable=*/false, Init); if (!D) return {}; @@ -657,7 +662,7 @@ bool ByteCodeExprGen::visitDecl(const VarDecl *VD) { const Expr *Init = VD->getInit(); - if (Optional I = P.createGlobal(VD)) { + if (Optional I = P.createGlobal(VD, Init)) { if (Optional T = classify(VD->getType())) { { // Primitive declarations - compute the value and set it. Index: clang/lib/AST/Interp/Program.h =================================================================== --- clang/lib/AST/Interp/Program.h +++ clang/lib/AST/Interp/Program.h @@ -69,7 +69,7 @@ llvm::Optional getOrCreateDummy(const ParmVarDecl *PD); /// Creates a global and returns its index. - llvm::Optional createGlobal(const ValueDecl *VD); + llvm::Optional createGlobal(const ValueDecl *VD, const Expr *E); /// Creates a global from a lifetime-extended temporary. llvm::Optional createGlobal(const Expr *E); @@ -111,7 +111,8 @@ /// Creates a descriptor for a composite type. Descriptor *createDescriptor(const DeclTy &D, const Type *Ty, bool IsConst = false, bool IsTemporary = false, - bool IsMutable = false); + bool IsMutable = false, + const Expr *Init = nullptr); /// Context to manage declaration lifetimes. class DeclScope { @@ -134,7 +135,8 @@ friend class DeclScope; llvm::Optional createGlobal(const DeclTy &D, QualType Ty, - bool IsStatic, bool IsExtern); + bool IsStatic, bool IsExtern, + const Expr *Init = nullptr); /// Reference to the VM context. Context &Ctx; Index: clang/lib/AST/Interp/Program.cpp =================================================================== --- clang/lib/AST/Interp/Program.cpp +++ clang/lib/AST/Interp/Program.cpp @@ -127,7 +127,7 @@ if (auto Idx = getGlobal(VD)) return Idx; - if (auto Idx = createGlobal(VD)) { + if (auto Idx = createGlobal(VD, nullptr)) { GlobalIndices[VD] = *Idx; return Idx; } @@ -153,7 +153,8 @@ return {}; } -llvm::Optional Program::createGlobal(const ValueDecl *VD) { +llvm::Optional Program::createGlobal(const ValueDecl *VD, + const Expr *Init) { bool IsStatic, IsExtern; if (auto *Var = dyn_cast(VD)) { IsStatic = !Var->hasLocalStorage(); @@ -162,7 +163,7 @@ IsStatic = false; IsExtern = true; } - if (auto Idx = createGlobal(VD, VD->getType(), IsStatic, IsExtern)) { + if (auto Idx = createGlobal(VD, VD->getType(), IsStatic, IsExtern, Init)) { for (const Decl *P = VD; P; P = P->getPreviousDecl()) GlobalIndices[P] = *Idx; return *Idx; @@ -175,7 +176,8 @@ } llvm::Optional Program::createGlobal(const DeclTy &D, QualType Ty, - bool IsStatic, bool IsExtern) { + bool IsStatic, bool IsExtern, + const Expr *Init) { // Create a descriptor for the global. Descriptor *Desc; const bool IsConst = Ty.isConstQualified(); @@ -310,7 +312,7 @@ Descriptor *Program::createDescriptor(const DeclTy &D, const Type *Ty, bool IsConst, bool IsTemporary, - bool IsMutable) { + bool IsMutable, const Expr *Init) { // Classes and structures. if (auto *RT = Ty->getAs()) { if (auto *Record = getOrCreateRecord(RT->getDecl()))