diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-10-22 21:11:36 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-10-22 21:11:36 +0200 |
commit | 6e684eee8d03ef8f75e864d355695b7097c38a9f (patch) | |
tree | e222ce53ca61aedc0f8be8a856999a857459b32b | |
parent | 5818c8e43667f9e256b2d730a9a7d7bf56cbce83 (diff) | |
download | gcc-6e684eee8d03ef8f75e864d355695b7097c38a9f.zip gcc-6e684eee8d03ef8f75e864d355695b7097c38a9f.tar.gz gcc-6e684eee8d03ef8f75e864d355695b7097c38a9f.tar.bz2 |
re PR c++/33372 (segfault on incomplete code in openmp mode)
PR c++/33372
* semantics.c (finish_omp_clauses): Check !type_dependent_expression_p
before checking if its type is integral.
* g++.dg/gomp/pr33372-1.C: New test.
* g++.dg/gomp/pr33372-2.C: New test.
* g++.dg/gomp/pr33372-3.C: New test.
From-SVN: r129555
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/pr33372-1.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/pr33372-2.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/pr33372-3.C | 19 |
6 files changed, 74 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 903db53..29e5cb5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-10-22 Jakub Jelinek <jakub@redhat.com> + + PR c++/33372 + * semantics.c (finish_omp_clauses): Check !type_dependent_expression_p + before checking if its type is integral. + 2007-10-22 Jason Merrill <jason@redhat.com> PR c++/33620 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index b770269..815390c 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3413,8 +3413,8 @@ finish_omp_clauses (tree clauses) t = OMP_CLAUSE_NUM_THREADS_EXPR (c); if (t == error_mark_node) remove = true; - else if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) - && !type_dependent_expression_p (t)) + else if (!type_dependent_expression_p (t) + && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { error ("num_threads expression must be integral"); remove = true; @@ -3427,8 +3427,8 @@ finish_omp_clauses (tree clauses) ; else if (t == error_mark_node) remove = true; - else if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) - && !type_dependent_expression_p (t)) + else if (!type_dependent_expression_p (t) + && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { error ("schedule chunk size expression must be integral"); remove = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c49cd31..e7308e9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2007-10-22 Jakub Jelinek <jakub@redhat.com> + + PR c++/33372 + * g++.dg/gomp/pr33372-1.C: New test. + * g++.dg/gomp/pr33372-2.C: New test. + * g++.dg/gomp/pr33372-3.C: New test. + 2007-10-22 Michael Matz <matz@suse.de> PR tree-optimization/33855 diff --git a/gcc/testsuite/g++.dg/gomp/pr33372-1.C b/gcc/testsuite/g++.dg/gomp/pr33372-1.C new file mode 100644 index 0000000..62900bf --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr33372-1.C @@ -0,0 +1,19 @@ +// PR c++/33372 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template <typename T> +void f () +{ + extern T n (); +#pragma omp parallel num_threads(n) // { dg-error "num_threads expression must be integral" } + ; +#pragma omp parallel for schedule(static, n) + for (int i = 0; i < 10; i++) // { dg-error "chunk size expression must be integral" } + ; +} + +void g () +{ + f<int> (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr33372-2.C b/gcc/testsuite/g++.dg/gomp/pr33372-2.C new file mode 100644 index 0000000..cce7ecc --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr33372-2.C @@ -0,0 +1,19 @@ +// PR c++/33372 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template <typename T> +void f () +{ + T n = 6; +#pragma omp parallel num_threads(n) + ; +#pragma omp parallel for schedule(static, n) + for (int i = 0; i < 10; i++) + ; +} + +void g () +{ + f<int> (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr33372-3.C b/gcc/testsuite/g++.dg/gomp/pr33372-3.C new file mode 100644 index 0000000..8220f3c --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr33372-3.C @@ -0,0 +1,19 @@ +// PR c++/33372 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template <typename T> +void f () +{ + T n = 6; +#pragma omp parallel num_threads(n) // { dg-error "num_threads expression must be integral" } + ; +#pragma omp parallel for schedule(static, n) + for (int i = 0; i < 10; i++) // { dg-error "chunk size expression must be integral" } + ; +} + +void g () +{ + f<double> (); +} |