Commit 328eae1c by Jason Merrill Committed by Jason Merrill

PR c++/77379 - ABI tag on thunk

	* mangle.c (maybe_check_abi_tags): Add version parm, handle thunks.
	(mangle_thunk): Add thunk parameter.
	* method.c (finish_thunk): Pass it.
	* cp-tree.h: Declare it.

From-SVN: r239830
parent 34cedad5
2016-08-29 Jason Merrill <jason@redhat.com>
PR c++/77379
* mangle.c (maybe_check_abi_tags): Add version parm, handle thunks.
(mangle_thunk): Add thunk parameter.
* method.c (finish_thunk): Pass it.
* cp-tree.h: Declare it.
2016-08-15 Jason Merrill <jason@redhat.com>
Avoid calling a trivial default constructor.
......
......@@ -6802,7 +6802,7 @@ extern tree mangle_typeinfo_string_for_type (tree);
extern tree mangle_vtbl_for_type (tree);
extern tree mangle_vtt_for_type (tree);
extern tree mangle_ctor_vtbl_for_type (tree, tree);
extern tree mangle_thunk (tree, int, tree, tree);
extern tree mangle_thunk (tree, int, tree, tree, tree);
extern tree mangle_conv_op_name_for_type (tree);
extern tree mangle_guard_variable (tree);
extern tree mangle_tls_init_fn (tree);
......
......@@ -231,7 +231,7 @@ static void write_local_name (tree, const tree, const tree);
static void dump_substitution_candidates (void);
static tree mangle_decl_string (const tree);
static int local_class_index (tree);
static void maybe_check_abi_tags (tree, tree = NULL_TREE);
static void maybe_check_abi_tags (tree, tree = NULL_TREE, int = 10);
static bool equal_abi_tags (tree, tree);
/* Control functions. */
......@@ -4024,10 +4024,13 @@ mangle_call_offset (const tree fixed_offset, const tree virtual_offset)
tree
mangle_thunk (tree fn_decl, const int this_adjusting, tree fixed_offset,
tree virtual_offset)
tree virtual_offset, tree thunk)
{
tree result;
if (abi_version_at_least (11))
maybe_check_abi_tags (fn_decl, thunk, 11);
start_mangling (fn_decl);
write_string ("_Z");
......@@ -4142,7 +4145,7 @@ mangle_conv_op_name_for_type (const tree type)
guard variable for T. */
static void
maybe_check_abi_tags (tree t, tree for_decl)
maybe_check_abi_tags (tree t, tree for_decl, int ver)
{
if (DECL_ASSEMBLER_NAME_SET_P (t))
return;
......@@ -4153,9 +4156,14 @@ maybe_check_abi_tags (tree t, tree for_decl)
tree newtags = get_abi_tags (t);
if (newtags && newtags != oldtags
&& abi_version_crosses (10))
&& abi_version_crosses (ver))
{
if (for_decl)
if (for_decl && DECL_THUNK_P (for_decl))
warning_at (DECL_SOURCE_LOCATION (t), OPT_Wabi,
"the mangled name of a thunk for %qD changes between "
"-fabi-version=%d and -fabi-version=%d",
t, flag_abi_version, warn_abi_version);
else if (for_decl)
warning_at (DECL_SOURCE_LOCATION (for_decl), OPT_Wabi,
"the mangled name of %qD changes between "
"-fabi-version=%d and -fabi-version=%d",
......
......@@ -169,7 +169,7 @@ finish_thunk (tree thunk)
virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
function = THUNK_TARGET (thunk);
name = mangle_thunk (function, DECL_THIS_THUNK_P (thunk),
fixed_offset, virtual_offset);
fixed_offset, virtual_offset, thunk);
/* We can end up with declarations of (logically) different
covariant thunks, that do identical adjustments. The two thunks
......
// PR c++/77379
// { dg-options "-fabi-version=0 -Wabi=10" }
struct __attribute ((abi_tag ("bar"))) string { };
struct Mother
{
virtual ~Mother() {};
int bar;
};
struct Father
{
virtual string get_foo() = 0;
};
class Derived:
public Mother,
public Father
{
public:
string get_foo(); // { dg-warning "mangled name" }
};
struct Final:
public Derived
{
};
int main()
{
Final().get_foo();
}
// { dg-final { scan-assembler "_ZThn16_N7Derived7get_fooB3barEv" } }
// PR c++/77379
// { dg-options -fabi-version=10 }
struct __attribute ((abi_tag ("bar"))) string { };
struct Mother
{
virtual ~Mother() {};
int bar;
};
struct Father
{
virtual string get_foo() = 0;
};
class Derived:
public Mother,
public Father
{
public:
string get_foo();
};
struct Final:
public Derived
{
};
int main()
{
Final().get_foo();
}
// { dg-final { scan-assembler "_ZThn16_N7Derived7get_fooEv" } }
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