From: Thomas Preud'homme Date: Fri, 7 Nov 2014 16:21:15 +0000 (+0000) Subject: re PR c++/63366 (C++ __complex is not equivalent to __complex double) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1dc090e2f4a1b952e9369c31b6a154430de175d1;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c86f85bc644..de04ab709b1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2014-11-07 Thomas Preud'homme + + PR c++/63366 + * decl.c (grokdeclarator): Fix __complex meaning __complex double. + 2014-10-29 Richard Sandiford * constexpr.c: Remove redundant enum from machine_mode. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 320c39f636a..4abc1011e61 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 % meaning " + "%"); + } } /* 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 index 00000000000..f08912324ed --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr63366.C @@ -0,0 +1,10 @@ +// { dg-do run } +// { dg-options "-pedantic" } + +#include + +int +main (void) +{ + return typeid (__complex) != typeid (__complex double); /* { dg-warning "ISO C\\+\\+ does not support plain 'complex' meaning 'double complex'" } */ +}