aboutsummaryrefslogtreecommitdiff
path: root/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CodeGen/CodeGenModule.cpp')
-rw-r--r--CodeGen/CodeGenModule.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp
index c5e6a26859..ecabb814ae 100644
--- a/CodeGen/CodeGenModule.cpp
+++ b/CodeGen/CodeGenModule.cpp
@@ -202,8 +202,8 @@ static llvm::Constant *GenerateConversionToBool(llvm::Constant *Expression,
/// GenerateConstantCast - Generates a constant cast to convert the Expression
/// into the Target type.
static llvm::Constant *GenerateConstantCast(const Expr *Expression,
- QualType Target,
- CodeGenModule &CGM) {
+ QualType Target,
+ CodeGenModule &CGM) {
CodeGenTypes& Types = CGM.getTypes();
QualType Source = Expression->getType().getCanonicalType();
Target = Target.getCanonicalType();
@@ -346,6 +346,14 @@ static llvm::Constant *GenerateConstantExpr(const Expr *Expression,
}
switch (Expression->getStmtClass()) {
+ default: break; // default emits a warning and returns bogus value.
+ case Stmt::DeclRefExprClass: {
+ const ValueDecl *Decl = cast<DeclRefExpr>(Expression)->getDecl();
+ if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl))
+ return CGM.GetAddrOfFunctionDecl(FD, false);
+ break;
+ }
+
// Generate constant for floating point literal values.
case Stmt::FloatingLiteralClass: {
const FloatingLiteral *FLiteral = cast<FloatingLiteral>(Expression);
@@ -416,11 +424,10 @@ static llvm::Constant *GenerateConstantExpr(const Expr *Expression,
// an array or struct.
case Stmt::InitListExprClass:
return GenerateAggregateInit(cast<InitListExpr>(Expression), CGM);
-
- default:
- CGM.WarnUnsupported(Expression, "initializer");
- return llvm::UndefValue::get(Types.ConvertType(type));
}
+
+ CGM.WarnUnsupported(Expression, "initializer");
+ return llvm::UndefValue::get(Types.ConvertType(type));
}
llvm::Constant *CodeGenModule::EmitGlobalInit(const Expr *Expression) {