forked from OSchip/llvm-project
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
This commit is contained in:
parent
0a2c416894
commit
03007d79fe
|
@ -3463,7 +3463,16 @@ Sema::BuildExpressionFromIntegralTemplateArgument(const TemplateArgument &Arg,
|
||||||
T,
|
T,
|
||||||
Loc));
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,3 +19,9 @@ class Base1 {
|
||||||
class Base2 { };
|
class Base2 { };
|
||||||
|
|
||||||
class Derived1 : Base1, virtual public Base2 { };
|
class Derived1 : Base1, virtual public Base2 { };
|
||||||
|
|
||||||
|
/* Template classes, template functions */
|
||||||
|
enum E1 { EC1 };
|
||||||
|
template <E1 v> class C1 {};
|
||||||
|
template <E1 v> C1<v> f1() { return C1<v>(); }
|
||||||
|
void f2() { f1<EC1>(); }
|
||||||
|
|
Loading…
Reference in New Issue