Commit 1dc090e2 by Thomas Preud'homme Committed by Jason Merrill

re PR c++/63366 (C++ __complex is not equivalent to __complex double)

	PR c++/63366
	* decl.c (grokdeclarator): Fix __complex meaning __complex double.

From-SVN: r217229
parent d296d8f3
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.
......
......@@ -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)
......
// { 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'" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment