aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-02-25 09:09:18 -0500
committerJason Merrill <jason@gcc.gnu.org>2016-02-25 09:09:18 -0500
commit6284a979dba8e74efe6c36b33311f1b4bac10f44 (patch)
tree5e690eac2f746a80a13c47a2de8bad6c4205c448 /gcc
parent798e2a8ed800a05e24f8969dc236bc4b7b2af163 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/tree.c10
-rw-r--r--gcc/testsuite/g++.dg/ext/attribute-may-alias-3.C22
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;
+}