From: Douglas Gregor Date: Thu, 31 Jan 2008 20:06:33 +0000 (+0000) Subject: re PR c++/34935 (ICE with attribute may_alias) X-Git-Tag: releases/gcc-4.3.0~314 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0451301c5987ec736e4e7c8a2f430b3b9051288e;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a5d19e6bc695..5b4cc3bb49b5 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 7377a3ea455c..09a34562e8d3 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 fd2a3193a473..4d6e06b59187 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 237b0567294f..2780a74e43d9 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 000000000000..843dec00c94b --- /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 000000000000..a7706e996d02 --- /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;