From 0451301c5987ec736e4e7c8a2f430b3b9051288e Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 31 Jan 2008 20:06:33 +0000 Subject: [PATCH] re PR c++/34935 (ICE with attribute may_alias) 2008-01-31 Douglas Gregor Jakub Jelinek PR c++/34935 PR c++/34936 * typeck.c (structural_comptypes): Handle comparisons of VOID_TYPE, BOOLEAN_TYPE, INTEGER_TYPE, FIXED_POINT_TYPE, and REAL_TYPE nodes. * mangle.c (write_builtin_type): Map down to the canonical type, which will be one of the predefined type nodes. 2008-01-31 Douglas Gregor Jakub Jelinek PR c++/34935 PR c++/34936 * g++.dg/ext/alias-canon.C: New. * g++.dg/ext/alias-mangle.C: New. Co-Authored-By: Jakub Jelinek From-SVN: r131984 --- gcc/cp/ChangeLog | 11 +++++++ gcc/cp/mangle.c | 3 ++ gcc/cp/typeck.c | 24 +++++++++++++++ gcc/testsuite/ChangeLog | 8 +++++ gcc/testsuite/g++.dg/ext/alias-canon.C | 41 +++++++++++++++++++++++++ gcc/testsuite/g++.dg/ext/alias-mangle.C | 11 +++++++ 6 files changed, 98 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/alias-canon.C create mode 100644 gcc/testsuite/g++.dg/ext/alias-mangle.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a5d19e6bc69..5b4cc3bb49b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2008-01-31 Douglas Gregor + Jakub Jelinek + + PR c++/34935 + PR c++/34936 + * typeck.c (structural_comptypes): Handle comparisons of + VOID_TYPE, BOOLEAN_TYPE, INTEGER_TYPE, FIXED_POINT_TYPE, and + REAL_TYPE nodes. + * mangle.c (write_builtin_type): Map down to the canonical type, + which will be one of the predefined type nodes. + 2008-01-29 Michael Meissner PR 35004 diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 7377a3ea455..09a34562e8d 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1768,6 +1768,9 @@ write_CV_qualifiers_for_type (const tree type) static void write_builtin_type (tree type) { + if (TYPE_CANONICAL (type)) + type = TYPE_CANONICAL (type); + switch (TREE_CODE (type)) { case VOID_TYPE: diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index fd2a3193a47..4d6e06b5918 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -977,6 +977,30 @@ structural_comptypes (tree t1, tree t2, int strict) /* Compare the types. Break out if they could be the same. */ switch (TREE_CODE (t1)) { + case VOID_TYPE: + case BOOLEAN_TYPE: + /* All void and bool types are the same. */ + break; + + case INTEGER_TYPE: + case FIXED_POINT_TYPE: + case REAL_TYPE: + /* With these nodes, we can't determine type equivalence by + looking at what is stored in the nodes themselves, because + two nodes might have different TYPE_MAIN_VARIANTs but still + represent the same type. For example, wchar_t and int could + have the same properties (TYPE_PRECISION, TYPE_MIN_VALUE, + TYPE_MAX_VALUE, etc.), but have different TYPE_MAIN_VARIANTs + and are distinct types. On the other hand, int and the + following typedef + + typedef int INT __attribute((may_alias)); + + have identical properties, different TYPE_MAIN_VARIANTs, but + represent the same type. The canonical type system keeps + track of equivalence in this case, so we fall back on it. */ + return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2); + case TEMPLATE_TEMPLATE_PARM: case BOUND_TEMPLATE_TEMPLATE_PARM: if (TEMPLATE_TYPE_IDX (t1) != TEMPLATE_TYPE_IDX (t2) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 237b0567294..2780a74e43d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-01-31 Douglas Gregor + Jakub Jelinek + + PR c++/34935 + PR c++/34936 + * g++.dg/ext/alias-canon.C: New. + * g++.dg/ext/alias-mangle.C: New. + 2008-01-30 Jan Hubicka * gcc.c-torture/execute/pr34982.c: Add forgotten return 0. diff --git a/gcc/testsuite/g++.dg/ext/alias-canon.C b/gcc/testsuite/g++.dg/ext/alias-canon.C new file mode 100644 index 00000000000..843dec00c94 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/alias-canon.C @@ -0,0 +1,41 @@ +// PR c++/34935 +/* { dg-do compile } */ +/* { dg-final { scan-assembler "_Z1fi" } } */ +/* { dg-final { scan-assembler "_Z1fb" } } */ +/* { dg-final { scan-assembler "_Z1fd" } } */ +/* { dg-final { scan-assembler "_Z1ff" } } */ +/* { dg-final { scan-assembler "_Z1fw" } } */ + +typedef int INT __attribute((may_alias)); + +void f(int); +void f(INT) { } + +typedef bool BOOL __attribute((may_alias)); + +void f(bool); +void f(BOOL) { } + +typedef float FLOAT __attribute((may_alias)); + +void f(float); +void f(FLOAT) { } + +typedef double DOUBLE __attribute((may_alias)); + +void f(double); +void f(DOUBLE) {} + +typedef wchar_t WCHAR_T __attribute((may_alias)); + +void f(wchar_t); +void f(WCHAR_T) {} + +void test() +{ + f(0); + f(true); + f(1.0f); + f(1.0); + f(L'f'); +} diff --git a/gcc/testsuite/g++.dg/ext/alias-mangle.C b/gcc/testsuite/g++.dg/ext/alias-mangle.C new file mode 100644 index 00000000000..a7706e996d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/alias-mangle.C @@ -0,0 +1,11 @@ +// PR c++/34936 +// { dg-do compile } +/* { dg-final { scan-assembler "_ZN1AIdEC1Ev" } } */ +typedef double X __attribute((may_alias)) ; + +template struct A +{ + A(); +}; + +A a;