From: Jason Merrill Date: Mon, 7 Mar 2011 20:10:44 +0000 (-0500) Subject: re PR c++/48008 (libstdc++-v3/testsuite/20_util/function/43397.cc fails to assemble... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=27062604920c7180050961af306f45b262aba93b;p=gcc.git re PR c++/48008 (libstdc++-v3/testsuite/20_util/function/43397.cc fails to assemble with -fabi-version=5) PR c++/48008 * mangle.c (write_type): Strip cv-quals from FUNCTION_TYPE here. (write_CV_qualifiers_for_type): Not here. From-SVN: r170752 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3e228b0395c..03fe7def983 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-03-07 Jason Merrill + + 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 * lang-specs.h: Match -save-temps* instead of -save-temps. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 0297a2adc58..c46ba305def 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 7635092e696..71fc429469c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-03-07 Jason Merrill + + * g++.dg/abi/mangle46.C: New. + 2011-03-07 Pat Haugen 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 00000000000..fddc88d0ad4 --- /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 +struct A +{ }; + +typedef void cfn(int) const; +typedef void fn(int); + +// { dg-final { scan-assembler "_Z1f1AIFviEE" } } +void f(A) { } +// { dg-final { scan-assembler "_Z1f1AIKFviEE" } } +void f(A) { }