diff options
author | Jason Merrill <jason@redhat.com> | 2016-02-25 09:09:18 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-02-25 09:09:18 -0500 |
commit | 6284a979dba8e74efe6c36b33311f1b4bac10f44 (patch) | |
tree | 5e690eac2f746a80a13c47a2de8bad6c4205c448 /gcc | |
parent | 798e2a8ed800a05e24f8969dc236bc4b7b2af163 (diff) | |
download | gcc-6284a979dba8e74efe6c36b33311f1b4bac10f44.zip gcc-6284a979dba8e74efe6c36b33311f1b4bac10f44.tar.gz gcc-6284a979dba8e74efe6c36b33311f1b4bac10f44.tar.bz2 |
re PR c++/68049 (template instantiation involving may_alias defines symbol twice)
PR c++/68049
* tree.c (strip_typedefs): Use DECL_ORIGINAL_TYPE.
From-SVN: r233715
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/tree.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/attribute-may-alias-3.C | 22 |
3 files changed, 36 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3ae4daf..eb5cfe6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2016-02-25 Jason Merrill <jason@redhat.com> + + PR c++/68049 + * tree.c (strip_typedefs): Use DECL_ORIGINAL_TYPE. + 2016-02-25 Patrick Palka <ppalka@gcc.gnu.org> PR c++/69736 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 0f7287a..ac38ce3 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1447,7 +1447,15 @@ strip_typedefs (tree t, bool *remove_attributes) } if (!result) - result = TYPE_MAIN_VARIANT (t); + { + if (typedef_variant_p (t)) + /* Explicitly get the underlying type, as TYPE_MAIN_VARIANT doesn't + strip typedefs with attributes. */ + result = TYPE_MAIN_VARIANT (DECL_ORIGINAL_TYPE (TYPE_NAME (t))); + else + result = TYPE_MAIN_VARIANT (t); + } + gcc_assert (!typedef_variant_p (result)); if (TYPE_USER_ALIGN (t) != TYPE_USER_ALIGN (result) || TYPE_ALIGN (t) != TYPE_ALIGN (result)) { diff --git a/gcc/testsuite/g++.dg/ext/attribute-may-alias-3.C b/gcc/testsuite/g++.dg/ext/attribute-may-alias-3.C new file mode 100644 index 0000000..ba6091b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attribute-may-alias-3.C @@ -0,0 +1,22 @@ +// PR c++/68049 +// { dg-do compile { target c++11 } } + +template <typename T> struct Bar +{ + using type = T; +}; +template <typename T> struct Foo +{ + typedef typename Bar<T>::type alias_type [[gnu::may_alias]]; + + alias_type operator()() { return {}; } +}; + +template <typename T> void print(T) {} + +int main() +{ + print(Foo<int>()()); + print(0); + return 0; +} |