summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorWill Wilson <will@indefiant.com>2014-12-13 04:31:07 +0000
committerWill Wilson <will@indefiant.com>2014-12-13 04:31:07 +0000
commit67c41ba0dd7c2d6aeb5c74b232d0ec813d0bb13e (patch)
treed7292fd34e738729f541a18260ed6c67709674da /clang
parent01ad4ae72b375ffd6ee1a44240c7a55498ccef8b (diff)
downloadbcm5719-llvm-67c41ba0dd7c2d6aeb5c74b232d0ec813d0bb13e.tar.gz
bcm5719-llvm-67c41ba0dd7c2d6aeb5c74b232d0ec813d0bb13e.zip
Pretty print support for template arg enum constants
llvm-svn: 224184
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/TemplateBase.cpp15
-rw-r--r--clang/test/SemaCXX/return-noreturn.cpp2
-rw-r--r--clang/test/SemaTemplate/temp_arg_enum_printing.cpp24
3 files changed, 38 insertions, 3 deletions
diff --git a/clang/lib/AST/TemplateBase.cpp b/clang/lib/AST/TemplateBase.cpp
index f07b18e7c12..4250c813a28 100644
--- a/clang/lib/AST/TemplateBase.cpp
+++ b/clang/lib/AST/TemplateBase.cpp
@@ -33,11 +33,22 @@ using namespace clang;
/// \param TemplArg the TemplateArgument instance to print.
///
/// \param Out the raw_ostream instance to use for printing.
+///
+/// \param Policy the printing policy for EnumConstantDecl printing.
static void printIntegral(const TemplateArgument &TemplArg,
- raw_ostream &Out) {
+ raw_ostream &Out, const PrintingPolicy& Policy) {
const ::clang::Type *T = TemplArg.getIntegralType().getTypePtr();
const llvm::APSInt &Val = TemplArg.getAsIntegral();
+ if (const EnumType* ET = T->getAs<EnumType>()) {
+ for (const EnumConstantDecl* ECD : ET->getDecl()->enumerators()) {
+ if (ECD->getInitVal() == Val) {
+ ECD->printQualifiedName(Out, Policy);
+ return;
+ }
+ }
+ }
+
if (T->isBooleanType()) {
Out << (Val.getBoolValue() ? "true" : "false");
} else if (T->isCharType()) {
@@ -378,7 +389,7 @@ void TemplateArgument::print(const PrintingPolicy &Policy,
break;
case Integral: {
- printIntegral(*this, Out);
+ printIntegral(*this, Out, Policy);
break;
}
diff --git a/clang/test/SemaCXX/return-noreturn.cpp b/clang/test/SemaCXX/return-noreturn.cpp
index 61b45c53701..cdd96e6a9ec 100644
--- a/clang/test/SemaCXX/return-noreturn.cpp
+++ b/clang/test/SemaCXX/return-noreturn.cpp
@@ -143,7 +143,7 @@ template <PR9412_MatchType type> int PR9412_t() {
} // expected-warning {{control reaches end of non-void function}}
void PR9412_f() {
- PR9412_t<PR9412_Exact>(); // expected-note {{in instantiation of function template specialization 'PR9412_t<0>' requested here}}
+ PR9412_t<PR9412_Exact>(); // expected-note {{in instantiation of function template specialization 'PR9412_t<PR9412_MatchType::PR9412_Exact>' requested here}}
}
struct NoReturn {
diff --git a/clang/test/SemaTemplate/temp_arg_enum_printing.cpp b/clang/test/SemaTemplate/temp_arg_enum_printing.cpp
new file mode 100644
index 00000000000..a788975b20d
--- /dev/null
+++ b/clang/test/SemaTemplate/temp_arg_enum_printing.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -fsyntax-only -ast-print %s | FileCheck %s
+
+namespace NamedEnumNS
+{
+
+enum NamedEnum
+{
+ Val0,
+ Val1
+};
+
+template <NamedEnum E>
+void foo();
+
+void test() {
+ // CHECK: template <NamedEnumNS::NamedEnum E = NamedEnumNS::NamedEnum::Val0>
+ NamedEnumNS::foo<Val0>();
+ // CHECK: template <NamedEnumNS::NamedEnum E = NamedEnumNS::NamedEnum::Val1>
+ NamedEnumNS::foo<(NamedEnum)1>();
+ // CHECK: template <NamedEnumNS::NamedEnum E = 2>
+ NamedEnumNS::foo<(NamedEnum)2>();
+}
+
+} // NamedEnumNS
OpenPOWER on IntegriCloud