r372541 - For P0784R7: add further testing of requirements on constexpr
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Sun Sep 22 22:08:55 PDT 2019
Author: rsmith
Date: Sun Sep 22 22:08:55 2019
New Revision: 372541
URL: http://llvm.org/viewvc/llvm-project?rev=372541&view=rev
Log:
For P0784R7: add further testing of requirements on constexpr
destructors.
Added:
cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp
Added: cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp?rev=372541&view=auto
==============================================================================
--- cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp (added)
+++ cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp Sun Sep 22 22:08:55 2019
@@ -0,0 +1,68 @@
+// RUN: %clang_cc1 -std=c++2a -verify %s
+
+// p3: if the function is a constructor or destructor, its class shall not have
+// any virtual base classes;
+namespace vbase {
+ struct A {};
+ struct B : virtual A { // expected-note {{virtual}}
+ constexpr ~B() {} // expected-error {{constexpr member function not allowed in struct with virtual base class}}
+ };
+}
+
+// p3: its function-body shall not enclose
+// -- a goto statement
+// -- an identifier label
+// -- a variable of non-literal type or of static or thread storage duration
+namespace contents {
+ struct A {
+ constexpr ~A() {
+ goto x; // expected-error {{statement not allowed in constexpr function}}
+ x: ;
+ }
+ };
+ struct B {
+ constexpr ~B() {
+ x: ; // expected-error {{statement not allowed in constexpr function}}
+ }
+ };
+ struct Nonlit { Nonlit(); }; // expected-note {{not literal}}
+ struct C {
+ constexpr ~C() {
+ Nonlit nl; // expected-error {{non-literal}}
+ }
+ };
+ struct D {
+ constexpr ~D() {
+ static int a; // expected-error {{static variable}}
+ }
+ };
+ struct E {
+ constexpr ~E() {
+ thread_local int e; // expected-error {{thread_local variable}}
+ }
+ };
+ struct F {
+ constexpr ~F() {
+ extern int f;
+ }
+ };
+}
+
+// p5: for every subobject of class type or (possibly multi-dimensional) array
+// thereof, that class type shall have a constexpr destructor
+namespace subobject {
+ struct A {
+ ~A();
+ };
+ struct B : A { // expected-note {{here}}
+ constexpr ~B() {} // expected-error {{destructor cannot be declared constexpr because base class 'subobject::A' does not have a constexpr destructor}}
+ };
+ struct C {
+ A a; // expected-note {{here}}
+ constexpr ~C() {} // expected-error {{destructor cannot be declared constexpr because data member 'a' does not have a constexpr destructor}}
+ };
+ struct D : A {
+ A a;
+ constexpr ~D() = delete;
+ };
+}
More information about the cfe-commits
mailing list