aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-05-30 14:16:04 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2011-05-30 14:16:04 +0200
commit8a8c12a3cd7b8905616680d458249f2ec865396c (patch)
treeca2dbdc56edba786add5327f986d39143c80339c
parentc87765d6353faf250e749cc900a918f95ff1dc0c (diff)
downloadgcc-8a8c12a3cd7b8905616680d458249f2ec865396c.zip
gcc-8a8c12a3cd7b8905616680d458249f2ec865396c.tar.gz
gcc-8a8c12a3cd7b8905616680d458249f2ec865396c.tar.bz2
re PR c++/49223 (Internal compiler error when using OpenMP)
PR c++/49223 * semantics.c (finish_omp_clauses): Call require_complete_type even for copyin/copyprivate clauses. Only call cxx_omp_create_clause_info if inner_type is COMPLETE_TYPE_P. * g++.dg/gomp/pr49223-1.C: New test. * g++.dg/gomp/pr49223-2.C: New test. From-SVN: r174432
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/semantics.c6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr49223-1.C28
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr49223-2.C16
5 files changed, 61 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 04ae407..24aab15 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2011-05-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/49223
+ * semantics.c (finish_omp_clauses): Call require_complete_type
+ even for copyin/copyprivate clauses. Only call
+ cxx_omp_create_clause_info if inner_type is COMPLETE_TYPE_P.
+
2011-05-28 Jason Merrill <jason@redhat.com>
PR c++/46124
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 854bac7..ca9cf4b 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4042,12 +4042,13 @@ finish_omp_clauses (tree clauses)
break;
}
- if (need_complete_non_reference)
+ if (need_complete_non_reference || need_copy_assignment)
{
t = require_complete_type (t);
if (t == error_mark_node)
remove = true;
- else if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
+ else if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE
+ && need_complete_non_reference)
{
error ("%qE has reference type for %qs", t, name);
remove = true;
@@ -4089,6 +4090,7 @@ finish_omp_clauses (tree clauses)
Save the results, because later we won't be in the right context
for making these queries. */
if (CLASS_TYPE_P (inner_type)
+ && COMPLETE_TYPE_P (inner_type)
&& (need_default_ctor || need_copy_ctor || need_copy_assignment)
&& !type_dependent_expression_p (t)
&& cxx_omp_create_clause_info (c, inner_type, need_default_ctor,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2a504c7..cca4149 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2011-05-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/49223
+ * g++.dg/gomp/pr49223-1.C: New test.
+ * g++.dg/gomp/pr49223-2.C: New test.
+
2011-05-30 Richard Guenther <rguenther@suse.de>
PR tree-optimization/49218
diff --git a/gcc/testsuite/g++.dg/gomp/pr49223-1.C b/gcc/testsuite/g++.dg/gomp/pr49223-1.C
new file mode 100644
index 0000000..307210f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr49223-1.C
@@ -0,0 +1,28 @@
+// PR c++/49223
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <int N>
+struct V
+{
+ V () {}
+ ~V () {}
+};
+
+template <int N>
+struct S
+{
+ void foo ()
+ {
+ V <0> v;
+ #pragma omp parallel private (v)
+ ;
+ }
+};
+
+void
+bar (void)
+{
+ S <0> s;
+ s.foo ();
+}
diff --git a/gcc/testsuite/g++.dg/gomp/pr49223-2.C b/gcc/testsuite/g++.dg/gomp/pr49223-2.C
new file mode 100644
index 0000000..9539773
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr49223-2.C
@@ -0,0 +1,16 @@
+// PR c++/49223
+// { dg-do compile }
+// { dg-require-effective-target tls }
+// { dg-options "-fopenmp" }
+
+struct S; // { dg-error "forward declaration" }
+extern __thread struct S s; // { dg-error "has incomplete type" }
+struct T;
+extern __thread struct T t;
+
+void
+foo ()
+{
+ #pragma omp parallel copyin (s)
+ ;
+}