From 222e2a7620e6520ffaf4fc4e69d79c18da31542e Mon Sep 17 00:00:00 2001 From: "Zancanaro; Carlo" Date: Mon, 24 Sep 2012 09:58:17 +1000 Subject: Add the clang library to the repo (with some of my changes, too). --- clang/test/SemaCXX/enum-unscoped-nonexistent.cpp | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 clang/test/SemaCXX/enum-unscoped-nonexistent.cpp (limited to 'clang/test/SemaCXX/enum-unscoped-nonexistent.cpp') diff --git a/clang/test/SemaCXX/enum-unscoped-nonexistent.cpp b/clang/test/SemaCXX/enum-unscoped-nonexistent.cpp new file mode 100644 index 0000000..d49800c --- /dev/null +++ b/clang/test/SemaCXX/enum-unscoped-nonexistent.cpp @@ -0,0 +1,39 @@ +// RUN: %clang_cc1 -std=c++11 -verify %s + +struct Base { + static const int a = 1; +}; +template struct S : Base { + enum E : int; + constexpr int f(); + constexpr int g(); // expected-note {{declared here}} + void h(); +}; +template<> enum S::E : int {}; // expected-note {{enum 'S::E' was explicitly specialized here}} +template<> enum S::E : int { b = 2 }; +template<> enum S::E : int { a = 4 }; +template enum S::E : int { b = 8 }; + +// The unqualified-id here names a member of the non-dependent base class Base +// and not the injected enumerator name 'a' from the specialization. +template constexpr int S::f() { return a; } +static_assert(S().f() == 1, ""); +static_assert(S().f() == 1, ""); + +// The unqualified-id here names a member of the current instantiation, which +// bizarrely might not exist in some instantiations. +template constexpr int S::g() { return b; } // expected-error {{enumerator 'b' does not exist in instantiation of 'S'}} +static_assert(S().g() == 1, ""); // expected-note {{here}} expected-error {{not an integral constant expression}} expected-note {{undefined}} +static_assert(S().g() == 2, ""); +static_assert(S().g() == 8, ""); + +// 'b' is type-dependent, so these assertions should not fire before 'h' is +// instantiated. +template void S::h() { + char c[S::b]; + static_assert(b != 8, ""); + static_assert(sizeof(c) != 8, ""); +} +void f() { + S().h(); // ok, b == 2 +} -- cgit v1.2.3