re PR c++/79380 (ICE on C++11 code with illegal alignas specifier on x86_64-linux...
authorPaolo Carlini <paolo.carlini@oracle.com>
Sun, 19 Feb 2017 17:43:41 +0000 (17:43 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sun, 19 Feb 2017 17:43:41 +0000 (17:43 +0000)
/cp
2017-02-19  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/79380
* typeck.c (cxx_alignas_expr): Reject a non-integral alignas
argument.

/testsuite
2017-02-19  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/79380
* g++.dg/cpp0x/alignas8.C: New.

From-SVN: r245578

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/alignas8.C [new file with mode: 0644]

index d0803bfa433b86f0d025d6888e1135b4df21a0c5..20c7eed3bcb72e027da37b99b13373f74fbbc42e 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-19  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/79380
+       * typeck.c (cxx_alignas_expr): Reject a non-integral alignas
+       argument.
+
 2017-02-19  Eric Fiselier  <eric@efcs.ca>
            Jonathan Wakely  <jwakely@redhat.com>
 
index 87e7cc0b02996b7e2bc15f5d6f598600f14301ae..9297a99add60763600bcb0c137acf28184858700 100644 (file)
@@ -1795,6 +1795,12 @@ cxx_alignas_expr (tree e)
 
          the assignment-expression shall be an integral constant
         expression.  */
+
+  if (!INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (e)))
+    {
+      error ("%<alignas%> argument has non-integral type %qT", TREE_TYPE (e));
+      return error_mark_node;
+    }
   
   return cxx_constant_value (e);
 }
index c98d77481c6e4258985d67afb9502f271444281a..097cab4b5b8f88b10bd0af6bf001202b3deb4360 100644 (file)
@@ -1,3 +1,8 @@
+2017-02-19  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/79380
+       * g++.dg/cpp0x/alignas8.C: New.
+
 2017-02-19  Eric Fiselier  <eric@efcs.ca>
            Jonathan Wakely  <jwakely@redhat.com>
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/alignas8.C b/gcc/testsuite/g++.dg/cpp0x/alignas8.C
new file mode 100644 (file)
index 0000000..bd76233
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/79380
+// { dg-do compile { target c++11 } }
+
+template < typename > constexpr int f () {  return 8;  }
+
+// should have been: struct alignas (f<int>()) S {};
+struct alignas (f) S {};  // { dg-error "17:'alignas' argument has non-integral type" }