aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-07-02 06:15:40 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-07-02 06:15:40 +0000
commit622da859b816036290b7e6f046521e4dea388361 (patch)
tree802b2a5ff36e1c2670e1cc8e05f326a2dfa9ad0f
parentfb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369 (diff)
Additional testing for fixes in r158289 and r158290 to allow implicitly-declared
constructors for non-literal types to be constexpr in some circumstances. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159513 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--test/SemaCXX/constant-expression-cxx11.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/test/SemaCXX/constant-expression-cxx11.cpp b/test/SemaCXX/constant-expression-cxx11.cpp
index 066136dd84..d1f1f924c6 100644
--- a/test/SemaCXX/constant-expression-cxx11.cpp
+++ b/test/SemaCXX/constant-expression-cxx11.cpp
@@ -1270,6 +1270,31 @@ namespace InvalidClasses {
}
}
+// Constructors can be implicitly constexpr, even for a non-literal type.
+namespace ImplicitConstexpr {
+ struct Q { Q() = default; Q(const Q&) = default; Q(Q&&) = default; ~Q(); }; // expected-note 3{{here}}
+ struct R { constexpr R(); constexpr R(const R&); constexpr R(R&&); ~R(); };
+ struct S { R r; }; // expected-note 3{{here}}
+ struct T { T(const T&); T(T &&); ~T(); };
+ struct U { T t; }; // expected-note 3{{here}}
+ static_assert(!__is_literal_type(Q), "");
+ static_assert(!__is_literal_type(R), "");
+ static_assert(!__is_literal_type(S), "");
+ static_assert(!__is_literal_type(T), "");
+ static_assert(!__is_literal_type(U), "");
+ struct Test {
+ friend Q::Q() noexcept; // expected-error {{follows constexpr}}
+ friend Q::Q(Q&&) noexcept; // expected-error {{follows constexpr}}
+ friend Q::Q(const Q&) noexcept; // expected-error {{follows constexpr}}
+ friend S::S() noexcept; // expected-error {{follows constexpr}}
+ friend S::S(S&&) noexcept; // expected-error {{follows constexpr}}
+ friend S::S(const S&) noexcept; // expected-error {{follows constexpr}}
+ friend constexpr U::U() noexcept; // expected-error {{follows non-constexpr}}
+ friend constexpr U::U(U&&) noexcept; // expected-error {{follows non-constexpr}}
+ friend constexpr U::U(const U&) noexcept; // expected-error {{follows non-constexpr}}
+ };
+}
+
// Indirectly test that an implicit lvalue to xvalue conversion performed for
// an NRVO move operation isn't implemented as CK_LValueToRValue.
namespace PR12826 {