diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -1122,9 +1122,10 @@ } case CK_AtomicToNonAtomic: - case CK_NonAtomicToAtomic: - case CK_NoOp: case CK_ConstructorConversion: + case CK_FunctionToPointerDecay: + case CK_NoOp: + case CK_NonAtomicToAtomic: return Visit(subExpr, destType); case CK_ArrayToPointerDecay: @@ -1189,7 +1190,6 @@ case CK_CPointerToObjCPointerCast: case CK_BlockPointerToObjCPointerCast: case CK_AnyPointerToBlockPointerCast: - case CK_FunctionToPointerDecay: case CK_BaseToDerived: case CK_DerivedToBase: case CK_UncheckedDerivedToBase: @@ -1241,6 +1241,13 @@ return llvm::ConstantInt::get(CGM.getLLVMContext(), I->getValue()); } + llvm::Constant *VisitDeclRefExpr(DeclRefExpr *D, QualType T) { + ValueDecl *VD = D->getDecl(); + if (isa(VD)) + return CGM.getModule().getNamedValue(VD->getName()); + return nullptr; + } + llvm::Constant *EmitArrayInitialization(InitListExpr *ILE, QualType T) { auto *CAT = CGM.getContext().getAsConstantArrayType(ILE->getType()); assert(CAT && "can't emit array init for non-constant-bound array");