From: John McCall Date: Fri, 15 Jul 2011 07:47:58 +0000 (+0000) Subject: Restore the C-style cast hack for enum template arguments, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e9272de54094da012d49990acaf06553369d6ec;p=clang Restore the C-style cast hack for enum template arguments, which is required given the current setup for template argument deduction substitution validation, and add a test case to make sure we don't break it in the future. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135262 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 2514b48de3..3ac190e1d4 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -4152,7 +4152,16 @@ Sema::BuildExpressionFromIntegralTemplateArgument(const TemplateArgument &Arg, else BT = T; - return Owned(IntegerLiteral::Create(Context, *Arg.getAsIntegral(), BT, Loc)); + Expr *E = IntegerLiteral::Create(Context, *Arg.getAsIntegral(), BT, Loc); + if (T->isEnumeralType()) { + // FIXME: This is a hack. We need a better way to handle substituted + // non-type template parameters. + E = CStyleCastExpr::Create(Context, T, VK_RValue, CK_IntegralCast, E, 0, + Context.getTrivialTypeSourceInfo(T, Loc), + Loc, Loc); + } + + return Owned(E); } /// \brief Match two template parameters within template parameter lists. diff --git a/test/SemaTemplate/deduction.cpp b/test/SemaTemplate/deduction.cpp index 15c061c261..aecb5ee7c8 100644 --- a/test/SemaTemplate/deduction.cpp +++ b/test/SemaTemplate/deduction.cpp @@ -150,3 +150,15 @@ namespace test3 { } }; } + +// Verify that we can deduce enum-typed arguments correctly. +namespace test14 { + enum E { E0, E1 }; + template struct A {}; + template void foo(const A &a) {} + + void test() { + A a; + foo(a); + } +}