diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/c-omp.cc | 9 | ||||
-rw-r--r-- | gcc/cp/parser.cc | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/for-21.C | 18 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/for-22.C | 57 |
4 files changed, 81 insertions, 15 deletions
diff --git a/gcc/c-family/c-omp.cc b/gcc/c-family/c-omp.cc index 5bb1035..2ab9911 100644 --- a/gcc/c-family/c-omp.cc +++ b/gcc/c-family/c-omp.cc @@ -1311,10 +1311,11 @@ c_omp_is_loop_iterator (tree decl, struct c_omp_check_loop_iv_data *d) else if (TREE_CODE (TREE_VEC_ELT (d->declv, i)) == TREE_LIST && TREE_CHAIN (TREE_VEC_ELT (d->declv, i)) && (TREE_CODE (TREE_CHAIN (TREE_VEC_ELT (d->declv, i))) - == TREE_VEC) - && decl == TREE_VEC_ELT (TREE_CHAIN (TREE_VEC_ELT (d->declv, - i)), 2)) - return TREE_VEC_LENGTH (d->declv); + == TREE_VEC)) + for (int j = 2; + j < TREE_VEC_LENGTH (TREE_CHAIN (TREE_VEC_ELT (d->declv, i))); j++) + if (decl == TREE_VEC_ELT (TREE_CHAIN (TREE_VEC_ELT (d->declv, i)), j)) + return TREE_VEC_LENGTH (d->declv); return -1; } diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index e69097d..e8a5090 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -43126,8 +43126,16 @@ cp_convert_omp_range_for (tree &this_pre_body, vec<tree, va_gc> *for_block, tree t = build_x_indirect_ref (input_location, begin, RO_UNARY_STAR, NULL_TREE, tf_none); if (!error_operand_p (t)) - TREE_TYPE (orig_decl) = do_auto_deduction (TREE_TYPE (orig_decl), - t, auto_node); + { + TREE_TYPE (orig_decl) = do_auto_deduction (TREE_TYPE (orig_decl), + t, auto_node); + if (decomp_first_name) + { + ++processing_template_decl; + cp_finish_decomp (orig_decl, decomp_first_name, decomp_cnt); + --processing_template_decl; + } + } } tree v = make_tree_vec (decomp_cnt + 3); diff --git a/gcc/testsuite/g++.dg/gomp/for-21.C b/gcc/testsuite/g++.dg/gomp/for-21.C index fbdaa71..f5a7bf7 100644 --- a/gcc/testsuite/g++.dg/gomp/for-21.C +++ b/gcc/testsuite/g++.dg/gomp/for-21.C @@ -24,9 +24,9 @@ void f3 (S (&a)[10]) { #pragma omp for collapse (2) - for (auto [i, j, k] : a) // { dg-error "use of 'i' before deduction of 'auto'" "" { target *-*-* } .+1 } - for (int l = i; l < j; l += k) // { dg-error "use of 'j' before deduction of 'auto'" } - ; // { dg-error "use of 'k' before deduction of 'auto'" "" { target *-*-* } .-1 } + for (auto [i, j, k] : a) // { dg-error "initializer expression refers to iteration variable 'i'" } + for (int l = i; l < j; l += k) // { dg-error "condition expression refers to iteration variable 'j'" } + ; // { dg-error "increment expression refers to iteration variable 'k'" "" { target *-*-* } .-2 } } template <int N> @@ -54,9 +54,9 @@ void f6 (S (&a)[10]) { #pragma omp for collapse (2) - for (auto [i, j, k] : a) // { dg-error "use of 'i' before deduction of 'auto'" "" { target *-*-* } .-1 } - for (int l = i; l < j; l += k) // { dg-error "use of 'j' before deduction of 'auto'" } - ; // { dg-error "use of 'k' before deduction of 'auto'" "" { target *-*-* } .-3 } + for (auto [i, j, k] : a) // { dg-error "initializer expression refers to iteration variable 'i'" "" { target *-*-* } .-1 } + for (int l = i; l < j; l += k) // { dg-error "condition expression refers to iteration variable 'j'" } + ; // { dg-error "increment expression refers to iteration variable 'k'" "" { target *-*-* } .-3 } } template <typename T> @@ -84,9 +84,9 @@ void f9 (U (&a)[10]) { #pragma omp for collapse (2) - for (auto [i, j, k] : a) // { dg-error "use of 'i' before deduction of 'auto'" "" { target *-*-* } .-1 } - for (T l = i; l < j; l += k) // { dg-error "use of 'j' before deduction of 'auto'" } - ; // { dg-error "use of 'k' before deduction of 'auto'" "" { target *-*-* } .-3 } + for (auto [i, j, k] : a) // { dg-error "initializer expression refers to iteration variable 'i'" "" { target *-*-* } .-1 } + for (T l = i; l < j; l += k) // { dg-error "condition expression refers to iteration variable 'j'" } + ; // { dg-error "increment expression refers to iteration variable 'k'" "" { target *-*-* } .-3 } } void diff --git a/gcc/testsuite/g++.dg/gomp/for-22.C b/gcc/testsuite/g++.dg/gomp/for-22.C new file mode 100644 index 0000000..40802a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-22.C @@ -0,0 +1,57 @@ +// { dg-do compile { target c++17 } } + +namespace std { + template<typename T> struct tuple_size; + template<int, typename> struct tuple_element; +} + +struct A { + int i; + template <int I> int& get() { return i; } +}; + +template<> struct std::tuple_size<A> { static const int value = 3; }; +template<int I> struct std::tuple_element<I,A> { using type = int; }; + +struct B { + A *begin(); + A *end(); +}; + +void +f1 (B a) +{ + #pragma omp for collapse (2) + for (auto [i, j, k] : a) // { dg-error "initializer expression refers to iteration variable 'i'" "" { target *-*-* } .+1 } + for (int l = i; l < j; l += k) // { dg-error "condition expression refers to iteration variable 'j'" } + ; // { dg-error "increment expression refers to iteration variable 'k'" "" { target *-*-* } .-1 } +} + +template <int N> +void +f2 (B a) +{ + #pragma omp for collapse (2) + for (auto [i, j, k] : a) // { dg-error "initializer expression refers to iteration variable 'i'" "" { target *-*-* } .-1 } + for (int l = i; l < j; l += k) // { dg-error "condition expression refers to iteration variable 'j'" } + ; // { dg-error "increment expression refers to iteration variable 'k'" "" { target *-*-* } .-3 } +} + +template <typename T> +void +f3 (T a) +{ + #pragma omp for collapse (2) + for (auto [i, j, k] : a) // { dg-error "initializer expression refers to iteration variable 'i'" "" { target *-*-* } .-1 } + for (int l = i; l < j; l += k) // { dg-error "condition expression refers to iteration variable 'j'" } + ; // { dg-error "increment expression refers to iteration variable 'k'" "" { target *-*-* } .-3 } +} + +void +test () +{ + B b; + f1 (b); + f2 <0> (b); + f3 <B> (b); +} |