Fix abi-tag16.C.
* mangle.c (maybe_check_abi_tags): New. (write_guarded_var_name): Call it. (mangle_ref_init_variable): Call check_abi_tags. From-SVN: r233018
This commit is contained in:
parent
b676a0798f
commit
b1568582a0
4 changed files with 76 additions and 1 deletions
|
@ -1,5 +1,9 @@
|
|||
2016-01-31 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* mangle.c (maybe_check_abi_tags): New.
|
||||
(write_guarded_var_name): Call it.
|
||||
(mangle_ref_init_variable): Call check_abi_tags.
|
||||
|
||||
* pt.c (lookup_template_class_1): Don't share TYPE_ATTRIBUTES
|
||||
between template and instantiation.
|
||||
|
||||
|
|
|
@ -3931,6 +3931,30 @@ mangle_conv_op_name_for_type (const tree type)
|
|||
return identifier;
|
||||
}
|
||||
|
||||
/* Handle ABI backwards compatibility for past bugs where we didn't call
|
||||
check_abi_tags in places where it's needed: call check_abi_tags and warn if
|
||||
it makes a difference. */
|
||||
|
||||
static void
|
||||
maybe_check_abi_tags (tree t)
|
||||
{
|
||||
tree attr = lookup_attribute ("abi_tag", DECL_ATTRIBUTES (t));
|
||||
tree oldtags = NULL_TREE;
|
||||
if (attr)
|
||||
oldtags = TREE_VALUE (attr);
|
||||
|
||||
check_abi_tags (t);
|
||||
|
||||
if (!attr)
|
||||
attr = lookup_attribute ("abi_tag", DECL_ATTRIBUTES (t));
|
||||
if (attr && TREE_VALUE (attr) != oldtags
|
||||
&& abi_version_crosses (10))
|
||||
warning_at (DECL_SOURCE_LOCATION (t), OPT_Wabi,
|
||||
"the mangled name of the initialization guard variable for"
|
||||
"%qD changes between -fabi-version=%d and -fabi-version=%d",
|
||||
t, flag_abi_version, warn_abi_version);
|
||||
}
|
||||
|
||||
/* Write out the appropriate string for this variable when generating
|
||||
another mangled name based on this one. */
|
||||
|
||||
|
@ -3943,7 +3967,15 @@ write_guarded_var_name (const tree variable)
|
|||
to the reference, not the temporary. */
|
||||
write_string (IDENTIFIER_POINTER (DECL_NAME (variable)) + 4);
|
||||
else
|
||||
write_name (variable, /*ignore_local_scope=*/0);
|
||||
{
|
||||
/* Before ABI v10 we were failing to call check_abi_tags here. So if
|
||||
we're in pre-10 mode, wait until after write_name to call it. */
|
||||
if (abi_version_at_least (10))
|
||||
maybe_check_abi_tags (variable);
|
||||
write_name (variable, /*ignore_local_scope=*/0);
|
||||
if (!abi_version_at_least (10))
|
||||
maybe_check_abi_tags (variable);
|
||||
}
|
||||
}
|
||||
|
||||
/* Return an identifier for the name of an initialization guard
|
||||
|
@ -4007,6 +4039,7 @@ mangle_ref_init_variable (const tree variable)
|
|||
{
|
||||
start_mangling (variable);
|
||||
write_string ("_ZGR");
|
||||
check_abi_tags (variable);
|
||||
write_name (variable, /*ignore_local_scope=*/0);
|
||||
/* Avoid name clashes with aggregate initialization of multiple
|
||||
references at once. */
|
||||
|
|
19
gcc/testsuite/g++.dg/abi/abi-tag16.C
Normal file
19
gcc/testsuite/g++.dg/abi/abi-tag16.C
Normal file
|
@ -0,0 +1,19 @@
|
|||
// { dg-options -Wabi=9 }
|
||||
// { dg-final { scan-assembler "_ZGVZN1N1FEvE4NameB5cxx11" } }
|
||||
namespace std {
|
||||
__extension__ inline namespace __cxx11 __attribute__((abi_tag("cxx11"))) {
|
||||
struct String {
|
||||
String();
|
||||
};
|
||||
}
|
||||
}
|
||||
namespace N {
|
||||
inline void F() {
|
||||
{
|
||||
static std::String Name; // { dg-warning "mangled name" }
|
||||
}
|
||||
}
|
||||
void F2() {
|
||||
F();
|
||||
}
|
||||
}
|
19
gcc/testsuite/g++.dg/abi/abi-tag16a.C
Normal file
19
gcc/testsuite/g++.dg/abi/abi-tag16a.C
Normal file
|
@ -0,0 +1,19 @@
|
|||
// { dg-options "-fabi-version=9 -Wabi" }
|
||||
// { dg-final { scan-assembler "_ZGVZN1N1FEvE4Name" } }
|
||||
namespace std {
|
||||
__extension__ inline namespace __cxx11 __attribute__((abi_tag("cxx11"))) {
|
||||
struct String {
|
||||
String();
|
||||
};
|
||||
}
|
||||
}
|
||||
namespace N {
|
||||
inline void F() {
|
||||
{
|
||||
static std::String Name; // { dg-warning "mangled name" }
|
||||
}
|
||||
}
|
||||
void F2() {
|
||||
F();
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue