diff options
author | Douglas Gregor <doug.gregor@gmail.com> | 2008-01-31 20:06:33 +0000 |
---|---|---|
committer | Doug Gregor <dgregor@gcc.gnu.org> | 2008-01-31 20:06:33 +0000 |
commit | 0451301c5987ec736e4e7c8a2f430b3b9051288e (patch) | |
tree | e3ce23aff54310844d24fd7882f14fa469956d3d /gcc | |
parent | 5ca3d30cfb7596bbdabf9e644db03526958ba821 (diff) | |
download | gcc-0451301c5987ec736e4e7c8a2f430b3b9051288e.zip gcc-0451301c5987ec736e4e7c8a2f430b3b9051288e.tar.gz gcc-0451301c5987ec736e4e7c8a2f430b3b9051288e.tar.bz2 |
re PR c++/34935 (ICE with attribute may_alias)
2008-01-31 Douglas Gregor <doug.gregor@gmail.com>
Jakub Jelinek <jakub@redhat.com>
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 <doug.gregor@gmail.com>
Jakub Jelinek <jakub@redhat.com>
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 <jakub@redhat.com>
From-SVN: r131984
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 3 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/alias-canon.C | 41 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/alias-mangle.C | 11 |
6 files changed, 98 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a5d19e6..5b4cc3bb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2008-01-31 Douglas Gregor <doug.gregor@gmail.com> + Jakub Jelinek <jakub@redhat.com> + + 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 <michael.meissner@amd.com> PR 35004 diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 7377a3e..09a34562 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 fd2a319..4d6e06b 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 237b056..2780a74 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-01-31 Douglas Gregor <doug.gregor@gmail.com> + Jakub Jelinek <jakub@redhat.com> + + 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 <jh@suse.cz> * 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 0000000..843dec0 --- /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 0000000..a7706e99 --- /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<typename> struct A +{ + A(); +}; + +A<X> a; |