constexpr.c (literal_type_p): Return true for void type in C++14.
authorMarek Polacek <polacek@redhat.com>
Mon, 1 Dec 2014 15:26:10 +0000 (15:26 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Mon, 1 Dec 2014 15:26:10 +0000 (15:26 +0000)
* constexpr.c (literal_type_p): Return true for void type in C++14.

* g++.dg/cpp0x/constexpr-function2.C: Limit dg-error to C++11.
* g++.dg/cpp0x/constexpr-neg1.C: Likewise.
* g++.dg/cpp1y/constexpr-void1.C: New test.

From-SVN: r218220

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C
gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C
gcc/testsuite/g++.dg/cpp1y/constexpr-void1.C [new file with mode: 0644]

index c8047612f57ffcae6c450076ac16d624c9150a3c..77b2b1e771e9b412a136b1439de776349c37a024 100644 (file)
@@ -1,3 +1,7 @@
+2014-12-01  Marek Polacek  <polacek@redhat.com>
+
+       * constexpr.c (literal_type_p): Return true for void type in C++14.
+
 2014-12-01  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/60845
index f4aca4b9408d29615aa4a97e3bbb5f3a0dd4ac22..6fdb9f3657c040b063a4b3e4e3381bae1c1afa3a 100644 (file)
@@ -59,7 +59,8 @@ literal_type_p (tree t)
 {
   if (SCALAR_TYPE_P (t)
       || TREE_CODE (t) == VECTOR_TYPE
-      || TREE_CODE (t) == REFERENCE_TYPE)
+      || TREE_CODE (t) == REFERENCE_TYPE
+      || (VOID_TYPE_P (t) && cxx_dialect >= cxx14))
     return true;
   if (CLASS_TYPE_P (t))
     {
index 0655cdf0238b2865e64826e65d9ffc4111fdf8d5..715ea975b9bf00f34643a47287b73fcfb73f35e7 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-01  Marek Polacek  <polacek@redhat.com>
+
+       * g++.dg/cpp0x/constexpr-function2.C: Limit dg-error to C++11.
+       * g++.dg/cpp0x/constexpr-neg1.C: Likewise.
+       * g++.dg/cpp1y/constexpr-void1.C: New test.
+
 2014-12-01  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/60845
index 8c51c9ddd257931688389213cb77f0003607adff..95ee244e56b761c28210dca3e8c06de58c6a7329 100644 (file)
@@ -23,7 +23,7 @@ constexpr int area = squarei(side); // { dg-error "side|argument" }
 int next(constexpr int x) // { dg-error "parameter" }
 { return x + 1; }
 
-constexpr void f(int x)       // { dg-error "return type .void" }
+constexpr void f(int x)       // { dg-error "return type .void" "" { target c++11_only } }
 { /* ... */ }
 
 constexpr int prev(int x)
index 35f5e8e94f44e4c6858bf86f47d2156041ba63ff..dfa1d6bf12810e95eb0db3426bc1e7b0c09ee610 100644 (file)
@@ -29,7 +29,7 @@ int next(constexpr int x) {   // { dg-error "parameter" }
 extern constexpr int memsz;    // { dg-error "definition" }
 
 // error: return type is void
-constexpr void f(int x)                // { dg-error "void" }
+constexpr void f(int x)                // { dg-error "void" "" { target c++11_only } }
 { /* ... */ }
 // error: use of decrement
 constexpr int prev(int x)
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-void1.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-void1.C
new file mode 100644 (file)
index 0000000..10ef5bc
--- /dev/null
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++14 } }
+
+struct S
+{
+  int i = 20;
+
+  constexpr void
+  foo (void)
+  {
+    if (i > 20)
+      __builtin_abort ();
+  }
+};