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