From: Richard Smith Date: Mon, 2 Jul 2012 06:15:40 +0000 (+0000) Subject: Additional testing for fixes in r158289 and r158290 to allow implicitly-declared X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=622da859b816036290b7e6f046521e4dea388361;p=clang 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 --- 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 {