summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-02-19 11:16:29 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2008-02-19 11:16:29 +0100
commitedb6000e3720a4944ab375e01a933f658c00d4b0 (patch)
treedc0a25a9c498538bfe63c0c459f285b3d6871de5
parentdadb19e068ada9ee77d36be1c1bd14730d0493cd (diff)
downloadgcc-edb6000e3720a4944ab375e01a933f658c00d4b0.tar.gz
re PR c++/34964 (ICE with broken variable in #pragma omp threadprivate)
PR c++/34964 PR c++/35244 * semantics.c (finish_omp_threadprivate): Do nothing for error_operand_p vars. Afterwards ensure v is VAR_DECL. * gcc.dg/gomp/pr34964.c: New test. * g++.dg/gomp/pr34964.C: New test. * gcc.dg/gomp/pr35244.c: New test. * g++.dg/gomp/pr35244.C: New test. From-SVN: r132425
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr34964.C6
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr35244.C30
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr34964.c6
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr35244.c20
7 files changed, 80 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 79ecec280d7..386ff722c53 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2008-02-19 Jakub Jelinek <jakub@redhat.com>
+ PR c++/34964
+ PR c++/35244
+ * semantics.c (finish_omp_threadprivate): Do nothing for error_operand_p
+ vars. Afterwards ensure v is VAR_DECL.
+
PR c++/35078
* parser.c (cp_parser_omp_for_loop): If DECL has REFERENCE_TYPE, don't
call cp_finish_decl.
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 44c1e3f319b..472c5cc72f2 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -3742,9 +3742,14 @@ finish_omp_threadprivate (tree vars)
{
tree v = TREE_PURPOSE (t);
+ if (error_operand_p (v))
+ ;
+ else if (TREE_CODE (v) != VAR_DECL)
+ error ("%<threadprivate%> %qD is not file, namespace "
+ "or block scope variable", v);
/* If V had already been marked threadprivate, it doesn't matter
whether it had been used prior to this point. */
- if (TREE_USED (v)
+ else if (TREE_USED (v)
&& (DECL_LANG_SPECIFIC (v) == NULL
|| !CP_DECL_THREADPRIVATE_P (v)))
error ("%qE declared %<threadprivate%> after first use", v);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e25dfc9050a..b5ab00f0b67 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2008-02-19 Jakub Jelinek <jakub@redhat.com>
+ PR c++/34964
+ PR c++/35244
+ * gcc.dg/gomp/pr34964.c: New test.
+ * g++.dg/gomp/pr34964.C: New test.
+ * gcc.dg/gomp/pr35244.c: New test.
+ * g++.dg/gomp/pr35244.C: New test.
+
PR c++/35078
* g++.dg/gomp/pr35078.C: New test.
diff --git a/gcc/testsuite/g++.dg/gomp/pr34964.C b/gcc/testsuite/g++.dg/gomp/pr34964.C
new file mode 100644
index 00000000000..f5995a6da91
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr34964.C
@@ -0,0 +1,6 @@
+// PR c++/34964
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+char x[] = 0; // { dg-error "initializer fails to determine size" }
+#pragma omp threadprivate (x)
diff --git a/gcc/testsuite/g++.dg/gomp/pr35244.C b/gcc/testsuite/g++.dg/gomp/pr35244.C
new file mode 100644
index 00000000000..189df1eb26e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr35244.C
@@ -0,0 +1,30 @@
+// PR c++/35244
+// { dg-do compile }
+// { dg-require-effective-target tls_native }
+// { dg-options "-fopenmp" }
+
+int v1;
+namespace N1
+{
+ int v2;
+}
+namespace N2
+{
+ int v3;
+}
+using N1::v2;
+using namespace N2;
+struct A;
+typedef int i;
+#pragma omp threadprivate (i) // { dg-error "is not file, namespace or block scope variable" }
+#pragma omp threadprivate (A) // { dg-error "is not file, namespace or block scope variable" }
+#pragma omp threadprivate (v1, v2, v3)
+
+void foo ()
+{
+ static int v4;
+ {
+ static int v5;
+#pragma omp threadprivate (v4, v5)
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr34964.c b/gcc/testsuite/gcc.dg/gomp/pr34964.c
new file mode 100644
index 00000000000..7800be1d5cc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr34964.c
@@ -0,0 +1,6 @@
+/* PR c++/34964 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+char x[] = 0; /* { dg-error "invalid initializer" } */
+#pragma omp threadprivate (x)
diff --git a/gcc/testsuite/gcc.dg/gomp/pr35244.c b/gcc/testsuite/gcc.dg/gomp/pr35244.c
new file mode 100644
index 00000000000..aa19a18bb25
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr35244.c
@@ -0,0 +1,20 @@
+/* PR c++/35244 */
+/* { dg-do compile } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-options "-fopenmp" } */
+
+int v1;
+typedef struct A A;
+typedef int i;
+#pragma omp threadprivate (i) /* { dg-error "expected identifier before" } */
+#pragma omp threadprivate (A) /* { dg-error "expected identifier before" } */
+#pragma omp threadprivate (v1)
+
+void foo ()
+{
+ static int v4;
+ {
+ static int v5;
+#pragma omp threadprivate (v4, v5)
+ }
+}