summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaTemplate.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2010-12-15 15:06:14 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2010-12-15 15:06:14 +0000
commit03007d79fe9c2428a93c114c9f96e150dcb66f2d (patch)
tree131ad53a135633fb8431f7ccad79b1004c3dc2ea /clang/lib/Sema/SemaTemplate.cpp
parent0a2c41689416f4814e89f52c5d1ba63d566baa76 (diff)
downloadbcm5719-llvm-03007d79fe9c2428a93c114c9f96e150dcb66f2d.tar.gz
bcm5719-llvm-03007d79fe9c2428a93c114c9f96e150dcb66f2d.zip
Sema: have BuildExpressionFromIntegralTemplateArgument produce well-formed IntegerLiterals
BuildExpressionFromIntegralTemplateArgument can produce malformed IntegerLiterals with an EnumType if the template parameter type is an EnumType. This breaks the AST printer which expects all IntegerLiterals to have a plain integer type. Instead, give the IntegerLiteral the enum's promotion type and wrap in an implicit cast to the EnumType. llvm-svn: 121862
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
-rw-r--r--clang/lib/Sema/SemaTemplate.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index d38bffd9e36..088e0193a59 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -3463,7 +3463,16 @@ Sema::BuildExpressionFromIntegralTemplateArgument(const TemplateArgument &Arg,
T,
Loc));
- return Owned(IntegerLiteral::Create(Context, *Arg.getAsIntegral(), T, Loc));
+ QualType BT;
+ if (const EnumType *ET = T->getAs<EnumType>())
+ BT = ET->getDecl()->getPromotionType();
+ else
+ BT = T;
+
+ Expr *E = IntegerLiteral::Create(Context, *Arg.getAsIntegral(), BT, Loc);
+ ImpCastExprToType(E, T, CK_IntegralCast);
+
+ return Owned(E);
}
OpenPOWER on IntegriCloud