re PR c++/63366 (C++ __complex is not equivalent to __complex double)
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Fri, 7 Nov 2014 16:21:15 +0000 (16:21 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 7 Nov 2014 16:21:15 +0000 (11:21 -0500)
PR c++/63366
* decl.c (grokdeclarator): Fix __complex meaning __complex double.

From-SVN: r217229

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/torture/pr63366.C [new file with mode: 0644]

index c86f85b..de04ab7 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-07  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       PR c++/63366
+       * decl.c (grokdeclarator): Fix __complex meaning __complex double.
+
 2014-10-29  Richard Sandiford  <richard.sandiford@arm.com>
 
        * constexpr.c: Remove redundant enum from machine_mode.
index 320c39f..4abc101 100644 (file)
@@ -9182,11 +9182,23 @@ grokdeclarator (const cp_declarator *declarator,
     }
   /* No type at all: default to `int', and set DEFAULTED_INT
      because it was not a user-defined typedef.  */
-  if (type == NULL_TREE && (signed_p || unsigned_p || long_p || short_p))
+  if (type == NULL_TREE)
     {
-      /* These imply 'int'.  */
-      type = integer_type_node;
-      defaulted_int = 1;
+      if (signed_p || unsigned_p || long_p || short_p)
+       {
+         /* These imply 'int'.  */
+         type = integer_type_node;
+         defaulted_int = 1;
+       }
+      /* If we just have "complex", it is equivalent to "complex double".  */
+      else if (!longlong && !explicit_intN
+              && decl_spec_seq_has_spec_p (declspecs, ds_complex))
+       {
+         type = double_type_node;
+         pedwarn (declspecs->locations[ds_complex], OPT_Wpedantic,
+                  "ISO C++ does not support plain %<complex%> meaning "
+                  "%<double complex%>");
+       }
     }
   /* Gather flags.  */
   explicit_int = declspecs->explicit_int_p;
@@ -9371,13 +9383,8 @@ grokdeclarator (const cp_declarator *declarator,
     {
       if (TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
        error ("complex invalid for %qs", name);
-      /* If we just have "complex", it is equivalent to
-        "complex double", but if any modifiers at all are specified it is
-        the complex form of TYPE.  E.g, "complex short" is
-        "complex short int".  */
-      else if (defaulted_int && ! longlong && ! explicit_intN
-              && ! (long_p || short_p || signed_p || unsigned_p))
-       type = complex_double_type_node;
+      /* If a modifier is specified, the resulting complex is the complex
+        form of TYPE.  E.g, "complex short" is "complex short int".  */
       else if (type == integer_type_node)
        type = complex_integer_type_node;
       else if (type == float_type_node)
diff --git a/gcc/testsuite/g++.dg/torture/pr63366.C b/gcc/testsuite/g++.dg/torture/pr63366.C
new file mode 100644 (file)
index 0000000..f089123
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-do run }
+// { dg-options "-pedantic" }
+
+#include <typeinfo>
+
+int
+main (void)
+{
+  return typeid (__complex) != typeid (__complex double); /* { dg-warning "ISO C\\+\\+ does not support plain 'complex' meaning 'double complex'" } */
+}