Commit 65440c48 by Jason Merrill Committed by Jason Merrill

re PR c++/44282 (fastcall is not mangled at all)

	PR c++/44282

	* mangle.c (write_CV_qualifiers_for_type): Also warn about regparm
	mangling with lower -fabi-version.

From-SVN: r227761
parent 0d179691
2015-09-14 Jason Merrill <jason@redhat.com>
PR c++/44282
* mangle.c (write_CV_qualifiers_for_type): Also warn about regparm
mangling with lower -fabi-version.
2015-09-14 Paolo Carlini <paolo.carlini@oracle.com> 2015-09-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51911 PR c++/51911
......
...@@ -2196,7 +2196,7 @@ write_CV_qualifiers_for_type (const tree type) ...@@ -2196,7 +2196,7 @@ write_CV_qualifiers_for_type (const tree type)
We don't do this with classes and enums because their attributes We don't do this with classes and enums because their attributes
are part of their definitions, not something added on. */ are part of their definitions, not something added on. */
if (abi_version_at_least (10) && !OVERLOAD_TYPE_P (type)) if (!OVERLOAD_TYPE_P (type))
{ {
auto_vec<tree> vec; auto_vec<tree> vec;
for (tree a = TYPE_ATTRIBUTES (type); a; a = TREE_CHAIN (a)) for (tree a = TYPE_ATTRIBUTES (type); a; a = TREE_CHAIN (a))
...@@ -2207,31 +2207,34 @@ write_CV_qualifiers_for_type (const tree type) ...@@ -2207,31 +2207,34 @@ write_CV_qualifiers_for_type (const tree type)
&& !is_attribute_p ("abi_tag", name)) && !is_attribute_p ("abi_tag", name))
vec.safe_push (a); vec.safe_push (a);
} }
vec.qsort (attr_strcmp); if (abi_version_crosses (10) && !vec.is_empty ())
while (!vec.is_empty()) G.need_abi_warning = true;
if (abi_version_at_least (10))
{ {
tree a = vec.pop(); vec.qsort (attr_strcmp);
const attribute_spec *as while (!vec.is_empty())
= lookup_attribute_spec (get_attribute_name (a));
write_char ('U');
write_unsigned_number (strlen (as->name));
write_string (as->name);
if (TREE_VALUE (a))
{ {
write_char ('I'); tree a = vec.pop();
for (tree args = TREE_VALUE (a); args; const attribute_spec *as
args = TREE_CHAIN (args)) = lookup_attribute_spec (get_attribute_name (a));
write_char ('U');
write_unsigned_number (strlen (as->name));
write_string (as->name);
if (TREE_VALUE (a))
{ {
tree arg = TREE_VALUE (args); write_char ('I');
write_template_arg (arg); for (tree args = TREE_VALUE (a); args;
args = TREE_CHAIN (args))
{
tree arg = TREE_VALUE (args);
write_template_arg (arg);
}
write_char ('E');
} }
write_char ('E');
}
++num_qualifiers; ++num_qualifiers;
if (abi_version_crosses (10)) }
G.need_abi_warning = true;
} }
} }
......
// { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } }
// { dg-options "-fabi-version=8 -Wabi -save-temps" }
// { dg-final { scan-assembler "_Z18IndirectExternCallIPFviiEiEvT_T0_S3_" } }
template <typename F, typename T>
void IndirectExternCall(F f, T t1, T t2) { // { dg-warning "mangled name" }
typedef F (*WrapF)(F);
f (t1, t2);
}
__attribute__((regparm(3), stdcall))
void regparm_func (int i, int j)
{
if (i != 24 || j != 42)
__builtin_abort();
}
int main()
{
IndirectExternCall (regparm_func, 24, 42);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment