> From: Jason Merrill [mailto:ja...@redhat.com]
> Sent: Wednesday, October 29, 2014 4:43 PM
>
> Since this is a GNU extension, I think we want to be compatible with the
> C front end, which has
>
> > else if (specs->complex_p)
> > {
> > specs->typespec_word = cts_double;
> > pedwarn (specs->locations[cdw_complex], OPT_Wpedantic,
> > "ISO C does not support plain %<complex%> meaning "
> > "%<double complex%>");
> > }
>
> right after the code that parallels the block I mentioned in my earlier
> mail.
What about the following patch?
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index d26a432..d3ab81c 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -9158,11 +9158,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_int128
+ && 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;
@@ -9345,13 +9357,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_int128
- && ! (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
index 0000000..f089123
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr63366.C
@@ -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'" } */
+}
ChangeLog entries would be as follows:
*** cp/ChangeLog ***
2014-11-03 Thomas Preud'homme <thomas.preudho...@arm.com>
PR C++/63366
* decl.c (grokdeclarator): Set default for complex alone to complex
double and issue a pedantic warn for it.
*** testsuite/ChangeLog ***
2014-11-03 Thomas Preud'homme <thomas.preudho...@arm.com>
PR C++/63366
* g++.dg/torture/pr63366.C: New test.
Ok for trunk?
Best regards,
Thomas