summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorPaul Robinson <paul.robinson@sony.com>2017-12-21 21:47:22 +0000
committerPaul Robinson <paul.robinson@sony.com>2017-12-21 21:47:22 +0000
commitf183848ace53f11543eaeeaaf753d190e063f4b8 (patch)
tree2b8728c0f4911c76fa9fed2b05706777e341173b /clang
parenta973cc2282d4fa6f9822a87377e2c6cc28caa175 (diff)
downloadbcm5719-llvm-f183848ace53f11543eaeeaaf753d190e063f4b8.tar.gz
bcm5719-llvm-f183848ace53f11543eaeeaaf753d190e063f4b8.zip
[AST] Incorrectly qualified unscoped enumeration as template actual parameter.
An unscoped enumeration used as template argument, should not have any qualified information about its enclosing scope, as its visibility is global. In the case of scoped enumerations, they must include information about their enclosing scope. Patch by Carlos Alberto Enciso! Differential Revision: https://reviews.llvm.org/D39239 llvm-svn: 321312
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/Decl.cpp5
-rw-r--r--clang/test/Modules/odr.cpp2
-rw-r--r--clang/test/SemaCXX/return-noreturn.cpp2
-rw-r--r--clang/test/SemaTemplate/temp_arg_enum_printing.cpp4
-rw-r--r--clang/test/SemaTemplate/temp_arg_enum_printing_more.cpp26
-rw-r--r--clang/unittests/AST/NamedDeclPrinterTest.cpp4
6 files changed, 36 insertions, 7 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 2f51ec31a7b..ee15a4d2b4f 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -1548,7 +1548,10 @@ void NamedDecl::printQualifiedName(raw_ostream &OS,
// enumerator is declared in the scope that immediately contains
// the enum-specifier. Each scoped enumerator is declared in the
// scope of the enumeration.
- if (ED->isScoped() || ED->getIdentifier())
+ // For the case of unscoped enumerator, do not include in the qualified
+ // name any information about its enum enclosing scope, as is visibility
+ // is global.
+ if (ED->isScoped())
OS << *ED;
else
continue;
diff --git a/clang/test/Modules/odr.cpp b/clang/test/Modules/odr.cpp
index 9cdbb4f0806..c4700110af4 100644
--- a/clang/test/Modules/odr.cpp
+++ b/clang/test/Modules/odr.cpp
@@ -18,6 +18,6 @@ int x = f() + g();
// expected-note@a.h:3 {{declaration of 'f' does not match}}
// expected-note@a.h:1 {{definition has no member 'm'}}
-// expected-error@b.h:5 {{'E::e2' from module 'b' is not present in definition of 'E' in module 'a'}}
+// expected-error@b.h:5 {{'e2' from module 'b' is not present in definition of 'E' in module 'a'}}
// expected-error@b.h:3 {{'Y::f' from module 'b' is not present in definition of 'Y' in module 'a'}}
// expected-error@b.h:2 {{'Y::m' from module 'b' is not present in definition of 'Y' in module 'a'}}
diff --git a/clang/test/SemaCXX/return-noreturn.cpp b/clang/test/SemaCXX/return-noreturn.cpp
index cdd96e6a9ec..cfeddffb664 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<PR9412_MatchType::PR9412_Exact>' requested here}}
+ PR9412_t<PR9412_Exact>(); // expected-note {{in instantiation of function template specialization 'PR9412_t<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
index bdf277d308c..dbb4db81f67 100644
--- a/clang/test/SemaTemplate/temp_arg_enum_printing.cpp
+++ b/clang/test/SemaTemplate/temp_arg_enum_printing.cpp
@@ -13,9 +13,9 @@ template <NamedEnum E>
void foo();
void test() {
- // CHECK: template<> void foo<NamedEnumNS::NamedEnum::Val0>()
+ // CHECK: template<> void foo<NamedEnumNS::Val0>()
NamedEnumNS::foo<Val0>();
- // CHECK: template<> void foo<NamedEnumNS::NamedEnum::Val1>()
+ // CHECK: template<> void foo<NamedEnumNS::Val1>()
NamedEnumNS::foo<(NamedEnum)1>();
// CHECK: template<> void foo<2>()
NamedEnumNS::foo<(NamedEnum)2>();
diff --git a/clang/test/SemaTemplate/temp_arg_enum_printing_more.cpp b/clang/test/SemaTemplate/temp_arg_enum_printing_more.cpp
new file mode 100644
index 00000000000..a3a7158412e
--- /dev/null
+++ b/clang/test/SemaTemplate/temp_arg_enum_printing_more.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -fsyntax-only -ast-print %s -std=c++11 | FileCheck %s
+
+// Make sure that for template value arguments that are unscoped enumerators,
+// no qualified enum information is included in their name, as their visibility
+// is global. In the case of scoped enumerators, they must include information
+// about their enum enclosing scope.
+
+enum E1 { e1 };
+template<E1 v> struct tmpl_1 {};
+// CHECK: template<> struct tmpl_1<e1>
+tmpl_1<E1::e1> TMPL_1; // Name must be 'e1'.
+
+namespace nsp_1 { enum E2 { e2 }; }
+template<nsp_1::E2 v> struct tmpl_2 {};
+// CHECK: template<> struct tmpl_2<nsp_1::e2>
+tmpl_2<nsp_1::E2::e2> TMPL_2; // Name must be 'nsp_1::e2'.
+
+enum class E3 { e3 };
+template<E3 v> struct tmpl_3 {};
+// CHECK: template<> struct tmpl_3<E3::e3>
+tmpl_3<E3::e3> TMPL_3; // Name must be 'E3::e3'.
+
+namespace nsp_2 { enum class E4 { e4 }; }
+template<nsp_2::E4 v> struct tmpl_4 {};
+// CHECK: template<> struct tmpl_4<nsp_2::E4::e4>
+tmpl_4<nsp_2::E4::e4> TMPL_4; // Name must be 'nsp_2::E4::e4'.
diff --git a/clang/unittests/AST/NamedDeclPrinterTest.cpp b/clang/unittests/AST/NamedDeclPrinterTest.cpp
index 92df4577ac7..002bb28f374 100644
--- a/clang/unittests/AST/NamedDeclPrinterTest.cpp
+++ b/clang/unittests/AST/NamedDeclPrinterTest.cpp
@@ -143,7 +143,7 @@ TEST(NamedDeclPrinter, TestNamedEnum) {
ASSERT_TRUE(PrintedWrittenNamedDeclCXX11Matches(
"enum X { A };",
"A",
- "X::A"));
+ "A"));
}
TEST(NamedDeclPrinter, TestScopedNamedEnum) {
@@ -164,7 +164,7 @@ TEST(NamedDeclPrinter, TestClassWithUnscopedNamedEnum) {
ASSERT_TRUE(PrintedWrittenNamedDeclCXX11Matches(
"class X { enum Y { A }; };",
"A",
- "X::Y::A"));
+ "X::A"));
}
TEST(NamedDeclPrinter, TestClassWithScopedNamedEnum) {
OpenPOWER on IntegriCloud