re PR c++/34964 (ICE with broken variable in #pragma omp threadprivate)
authorJakub Jelinek <jakub@redhat.com>
Tue, 19 Feb 2008 10:16:29 +0000 (11:16 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 19 Feb 2008 10:16:29 +0000 (11:16 +0100)
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

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr34964.C [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/pr35244.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr34964.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr35244.c [new file with mode: 0644]

index 79ecec280d787bbbc281e2fed7ebf5be5cacda52..386ff722c53e0998aa37348281697986fa7e4ad9 100644 (file)
@@ -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.
index 44c1e3f319b9fbba994bccdda45ec6c8852b9dfa..472c5cc72f2d8e9db59b13ce1a8774d4c623e119 100644 (file)
@@ -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);
index e25dfc9050afd5b7059e315a66377759bdc2563e..b5ab00f0b670bd075fad02a59b6b15523ef359a7 100644 (file)
@@ -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 (file)
index 0000000..f5995a6
--- /dev/null
@@ -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 (file)
index 0000000..189df1e
--- /dev/null
@@ -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 (file)
index 0000000..7800be1
--- /dev/null
@@ -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 (file)
index 0000000..aa19a18
--- /dev/null
@@ -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)
+  }
+}