summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2010-03-20 08:55:32 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2010-03-20 09:55:32 +0100
commit39bac0102c930a6d38486f5716793d531dc90302 (patch)
tree2cbb1e98a70db4f750198b5cede54daf5d4f5bcc
parent4dd9ee924baa6c168c7c25d07e364d39729f4e8c (diff)
downloadgcc-39bac0102c930a6d38486f5716793d531dc90302.tar.gz
re PR c++/43375 (ICE during compiling SSE code)
Fix for PR c++/43375 gcc/cp/ChangeLog: PR c++/43375 * method.c (make_alias_for): Avoid crashing when DECL_LANG_SPECIFIC is NULL. * decl2.c (vague_linkage_p): Likewise. gcc/testsuite/g++.dg/ChangeLog: PR c++/43375 * g++.dg/abi/mangle42.C: New test. From-SVN: r157590
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/decl2.c3
-rw-r--r--gcc/cp/method.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle42.C14
5 files changed, 34 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index eecdd1a1941..41fb7923a7e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2010-03-20 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/43375
+ * method.c (make_alias_for): Avoid crashing when DECL_LANG_SPECIFIC
+ is NULL.
+ * decl2.c (vague_linkage_p): Likewise.
+
2010-03-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/43418
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 81d7ee3212f..4e4930af563 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1655,7 +1655,8 @@ vague_linkage_p (tree decl)
return (DECL_COMDAT (decl)
|| (((TREE_CODE (decl) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl))
- || DECL_TEMPLATE_INSTANTIATION (decl))
+ || (DECL_LANG_SPECIFIC (decl)
+ && DECL_TEMPLATE_INSTANTIATION (decl)))
&& TREE_PUBLIC (decl)));
}
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index a93ad068e52..5ed98bc93bd 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -221,12 +221,15 @@ make_alias_for (tree target, tree newid)
TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (target);
TREE_PUBLIC (alias) = 0;
DECL_INTERFACE_KNOWN (alias) = 1;
- DECL_NOT_REALLY_EXTERN (alias) = 1;
+ if (DECL_LANG_SPECIFIC (alias))
+ {
+ DECL_NOT_REALLY_EXTERN (alias) = 1;
+ DECL_USE_TEMPLATE (alias) = 0;
+ DECL_TEMPLATE_INFO (alias) = NULL;
+ }
DECL_EXTERNAL (alias) = 0;
DECL_ARTIFICIAL (alias) = 1;
- DECL_USE_TEMPLATE (alias) = 0;
DECL_TEMPLATE_INSTANTIATED (alias) = 0;
- DECL_TEMPLATE_INFO (alias) = NULL;
if (TREE_CODE (alias) == FUNCTION_DECL)
{
DECL_SAVED_FUNCTION_DATA (alias) = NULL;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8e5ca1fe14e..f0d88f0ed71 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-03-20 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/43375
+ * g++.dg/abi/mangle42.C: New test.
+
2010-03-19 Andrew Pinski <andrew_pinski@caviumnetworks.com>
PR C/43211
diff --git a/gcc/testsuite/g++.dg/abi/mangle42.C b/gcc/testsuite/g++.dg/abi/mangle42.C
new file mode 100644
index 00000000000..730781b300b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle42.C
@@ -0,0 +1,14 @@
+// Origin: PR c++/43375
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-msse2 -std=gnu++0x" }
+
+typedef float __v4sf __attribute__ ((__vector_size__ (16)));
+typedef int __v4si __attribute__ ((__vector_size__ (16)));
+__v4sf my_asin(__v4sf x)
+{
+ static const __v4si g_Mask{0x7fffffff,
+ 0x00000000,
+ 0x7fffffff,
+ 0x7fffffff };
+ return __builtin_ia32_andnps ((__v4sf) g_Mask, x);
+}