diff options
author | Mark Mitchell <mark@codesourcery.com> | 2002-04-25 01:05:25 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2002-04-25 01:05:25 +0000 |
commit | b970a21d1d35e0be3f32b967f56b6219f42aeb61 (patch) | |
tree | 8c3b7ca21c4b39b3beb16b79e48cc412d56b4838 | |
parent | a49cfba81bf9021a62ca111e7f7baea84213a19a (diff) | |
download | gcc-b970a21d1d35e0be3f32b967f56b6219f42aeb61.zip gcc-b970a21d1d35e0be3f32b967f56b6219f42aeb61.tar.gz gcc-b970a21d1d35e0be3f32b967f56b6219f42aeb61.tar.bz2 |
mangle.c (write_type): Don't use TYPE_MAIN_VARIANT when writing out an array type.
* mangle.c (write_type): Don't use TYPE_MAIN_VARIANT when writing
out an array type.
(write_CV_qualifiers_for_type): Use TYPE_QUALS, not cp_type_quals,
to determine qualifiers.
From-SVN: r52749
-rw-r--r-- | gcc/cp/mangle.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle7.C | 6 |
3 files changed, 21 insertions, 8 deletions
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 88461e2..322769c 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1358,6 +1358,11 @@ write_type (type) since both the qualified and uqualified types are substitution candidates. */ write_type (TYPE_MAIN_VARIANT (type)); + else if (TREE_CODE (type) == ARRAY_TYPE) + /* It is important not to use the TYPE_MAIN_VARIANT of TYPE here + so that the cv-qualification of the element type is available + in write_array_type. */ + write_array_type (type); else { /* See through any typedefs. */ @@ -1404,10 +1409,6 @@ write_type (type) write_nested_name (TYPE_STUB_DECL (type)); break; - case ARRAY_TYPE: - write_array_type (type); - break; - case POINTER_TYPE: /* A pointer-to-member variable is represented by a POINTER_TYPE to an OFFSET_TYPE, so check for this first. */ @@ -1474,19 +1475,23 @@ write_CV_qualifiers_for_type (type) "In cases where multiple order-insensitive qualifiers are present, they should be ordered 'K' (closest to the base type), - 'V', 'r', and 'U' (farthest from the base type) ..." */ + 'V', 'r', and 'U' (farthest from the base type) ..." + + Note that we do not use cp_type_quals below; given "const + int[3]", the "const" is emitted with the "int", not with the + array. */ - if (CP_TYPE_RESTRICT_P (type)) + if (TYPE_QUALS (type) & TYPE_QUAL_RESTRICT) { write_char ('r'); ++num_qualifiers; } - if (CP_TYPE_VOLATILE_P (type)) + if (TYPE_QUALS (type) & TYPE_QUAL_VOLATILE) { write_char ('V'); ++num_qualifiers; } - if (CP_TYPE_CONST_P (type)) + if (TYPE_QUALS (type) & TYPE_QUAL_CONST) { write_char ('K'); ++num_qualifiers; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a99b232..4f30310 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2002-04-24 Mark Mitchell <mark@codesourcery.com> + * g++.dg/abi/mange7.C: New test. + PR c++/6438. * g++.dg/parse/stmtexpr2.C: New test. diff --git a/gcc/testsuite/g++.dg/abi/mangle7.C b/gcc/testsuite/g++.dg/abi/mangle7.C new file mode 100644 index 0000000..af178d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle7.C @@ -0,0 +1,6 @@ +/* { dg-do compile } */ + +typedef void *const t1[2]; +float const f1(t1 (&)[79], ...) {} + +/* { dg-final { scan-assembler _Z2f1RA79_A2_KPvz } } */ |