diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle46.C | 15 |
4 files changed, 41 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3e228b0..03fe7de 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-03-07 Jason Merrill <jason@redhat.com> + + PR c++/48008 + * mangle.c (write_type): Strip cv-quals from FUNCTION_TYPE here. + (write_CV_qualifiers_for_type): Not here. + 2011-03-06 Joseph Myers <joseph@codesourcery.com> * lang-specs.h: Match -save-temps* instead of -save-temps. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 0297a2a..c46ba30 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1880,16 +1880,25 @@ write_type (tree type) break; case POINTER_TYPE: - write_char ('P'); - write_type (TREE_TYPE (type)); - break; - case REFERENCE_TYPE: - if (TYPE_REF_IS_RVALUE (type)) - write_char('O'); + if (TREE_CODE (type) == POINTER_TYPE) + write_char ('P'); + else if (TYPE_REF_IS_RVALUE (type)) + write_char ('O'); else write_char ('R'); - write_type (TREE_TYPE (type)); + { + tree target = TREE_TYPE (type); + /* Attribute const/noreturn are not reflected in mangling. + We strip them here rather than at a lower level because + a typedef or template argument can have function type + with function-cv-quals (that use the same representation), + but you can't have a pointer/reference to such a type. */ + if (abi_version_at_least (5) + && TREE_CODE (target) == FUNCTION_TYPE) + target = build_qualified_type (target, TYPE_UNQUALIFIED); + write_type (target); + } break; case TEMPLATE_TYPE_PARM: @@ -2017,12 +2026,6 @@ write_CV_qualifiers_for_type (const tree type) array. */ cp_cv_quals quals = TYPE_QUALS (type); - /* Attribute const/noreturn are not reflected in mangling. */ - if (abi_version_at_least (5) - && (TREE_CODE (type) == FUNCTION_TYPE - || TREE_CODE (type) == METHOD_TYPE)) - return 0; - if (quals & TYPE_QUAL_RESTRICT) { write_char ('r'); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7635092..71fc4294 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-03-07 Jason Merrill <jason@redhat.com> + + * g++.dg/abi/mangle46.C: New. + 2011-03-07 Pat Haugen <pthaugen@us.ibm.com> PR target/47862 diff --git a/gcc/testsuite/g++.dg/abi/mangle46.C b/gcc/testsuite/g++.dg/abi/mangle46.C new file mode 100644 index 0000000..fddc88d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle46.C @@ -0,0 +1,15 @@ +// PR c++/48008 +// { dg-options -fabi-version=5 } +// Test that we retain function-cv-quals in template argument mangling. + +template <class T> +struct A +{ }; + +typedef void cfn(int) const; +typedef void fn(int); + +// { dg-final { scan-assembler "_Z1f1AIFviEE" } } +void f(A<fn>) { } +// { dg-final { scan-assembler "_Z1f1AIKFviEE" } } +void f(A<cfn>) { } |