Hi! I've noticed a lot of spots where we weren't using exact location, even when we have OMP_CLAUSE_LOCATION we can use.
Fixed thusly, committed to gomp-5_0-branch. 2018-06-01 Jakub Jelinek <ja...@redhat.com> * c-typeck.c (c_finish_omp_clauses): Use error_at with OMP_CLAUSE_LOCATION (c) as first argument instead of error. Formatting fix. * semantics.c (finish_omp_reduction_clause): Use error_at with OMP_CLAUSE_LOCATION (c) as first argument instead of error. (finish_omp_clauses): * g++.dg/gomp/pr33372-1.C: Adjust location of the expected diagnostics. * g++.dg/gomp/pr33372-3.C: Likewise. --- gcc/c/c-typeck.c.jj 2018-06-01 09:52:06.498468358 +0200 +++ gcc/c/c-typeck.c 2018-06-01 16:30:56.051806429 +0200 @@ -13359,7 +13359,7 @@ c_finish_omp_clauses (tree clauses, enum if (TYPE_ATOMIC (TREE_TYPE (t))) { error_at (OMP_CLAUSE_LOCATION (c), - "%<_Atomic%> %qD in %<linear%> clause", t); + "%<_Atomic%> %qD in %<linear%> clause", t); remove = true; break; } @@ -13417,7 +13417,9 @@ c_finish_omp_clauses (tree clauses, enum { if (bitmap_bit_p (&oacc_reduction_head, DECL_UID (t))) { - error ("%qD appears more than once in reduction clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in reduction clauses", + t); remove = true; } else @@ -13435,9 +13437,11 @@ c_finish_omp_clauses (tree clauses, enum && bitmap_bit_p (&map_head, DECL_UID (t))) { if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears both in data and map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears both in data and map clauses", t); remove = true; } else @@ -13464,9 +13468,11 @@ c_finish_omp_clauses (tree clauses, enum else if (bitmap_bit_p (&map_head, DECL_UID (t))) { if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears both in data and map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears both in data and map clauses", t); remove = true; } else @@ -13641,14 +13647,17 @@ c_finish_omp_clauses (tree clauses, enum if (bitmap_bit_p (&map_head, DECL_UID (t))) { if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP) - error ("%qD appears more than once in motion" - " clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in motion " + "clauses", t); else if (ort == C_ORT_ACC) - error ("%qD appears more than once in data" - " clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data " + "clauses", t); else - error ("%qD appears more than once in map" - " clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in map " + "clauses", t); remove = true; } else @@ -13758,15 +13767,18 @@ c_finish_omp_clauses (tree clauses, enum if (bitmap_bit_p (&generic_head, DECL_UID (t)) || bitmap_bit_p (&firstprivate_head, DECL_UID (t))) { - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); remove = true; } else if (bitmap_bit_p (&map_head, DECL_UID (t))) { if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears both in data and map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears both in data and map clauses", t); remove = true; } else @@ -13775,20 +13787,25 @@ c_finish_omp_clauses (tree clauses, enum else if (bitmap_bit_p (&map_head, DECL_UID (t))) { if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP) - error ("%qD appears more than once in motion clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in motion clauses", t); else if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears more than once in map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in map clauses", t); remove = true; } else if (bitmap_bit_p (&generic_head, DECL_UID (t)) || bitmap_bit_p (&firstprivate_head, DECL_UID (t))) { if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears both in data and map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears both in data and map clauses", t); remove = true; } else --- gcc/cp/semantics.c.jj 2018-06-01 10:15:48.760084496 +0200 +++ gcc/cp/semantics.c 2018-06-01 17:18:31.812189717 +0200 @@ -5557,8 +5557,9 @@ finish_omp_reduction_clause (tree c, boo TYPE_SIZE_UNIT (type)); if (integer_zerop (size)) { - error ("%qE in %<reduction%> clause is a zero size array", - omp_clause_printable_decl (t)); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE in %<reduction%> clause is a zero size array", + omp_clause_printable_decl (t)); return true; } size = size_binop (MINUS_EXPR, size, size_one_node); @@ -5605,8 +5606,9 @@ finish_omp_reduction_clause (tree c, boo } else if (TYPE_READONLY (type)) { - error ("%qE has const type for %<reduction%>", - omp_clause_printable_decl (t)); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE has const type for %<reduction%>", + omp_clause_printable_decl (t)); return true; } else if (!processing_template_decl) @@ -5768,8 +5770,9 @@ finish_omp_reduction_clause (tree c, boo *need_dtor = true; else { - error ("user defined reduction not found for %qE", - omp_clause_printable_decl (t)); + error_at (OMP_CLAUSE_LOCATION (c), + "user defined reduction not found for %qE", + omp_clause_printable_decl (t)); return true; } if (TREE_CODE (OMP_CLAUSE_DECL (c)) == MEM_REF) @@ -5958,10 +5961,11 @@ finish_omp_clauses (tree clauses, enum c || OMP_CLAUSE_LINEAR_KIND (c) == OMP_CLAUSE_LINEAR_UVAL) && TREE_CODE (type) != REFERENCE_TYPE) { - error ("linear clause with %qs modifier applied to " - "non-reference variable with %qT type", - OMP_CLAUSE_LINEAR_KIND (c) == OMP_CLAUSE_LINEAR_REF - ? "ref" : "uval", TREE_TYPE (t)); + error_at (OMP_CLAUSE_LOCATION (c), + "linear clause with %qs modifier applied to " + "non-reference variable with %qT type", + OMP_CLAUSE_LINEAR_KIND (c) == OMP_CLAUSE_LINEAR_REF + ? "ref" : "uval", TREE_TYPE (t)); remove = true; break; } @@ -5972,8 +5976,10 @@ finish_omp_clauses (tree clauses, enum c if (!INTEGRAL_TYPE_P (type) && TREE_CODE (type) != POINTER_TYPE) { - error ("linear clause applied to non-integral non-pointer" - " variable with %qT type", TREE_TYPE (t)); + error_at (OMP_CLAUSE_LOCATION (c), + "linear clause applied to non-integral " + "non-pointer variable with %qT type", + TREE_TYPE (t)); remove = true; break; } @@ -5994,7 +6000,8 @@ finish_omp_clauses (tree clauses, enum c || TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE || !INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (t))))) { - error ("linear step expression must be integral"); + error_at (OMP_CLAUSE_LOCATION (c), + "linear step expression must be integral"); remove = true; break; } @@ -6086,8 +6093,9 @@ finish_omp_clauses (tree clauses, enum c || (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_LINEAR && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_UNIFORM))) { - error ("%<this%> allowed in OpenMP only in %<declare simd%>" - " clauses"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<this%> allowed in OpenMP only in %<declare simd%>" + " clauses"); remove = true; break; } @@ -6097,11 +6105,13 @@ finish_omp_clauses (tree clauses, enum c if (processing_template_decl && TREE_CODE (t) != OVERLOAD) break; if (DECL_P (t)) - error ("%qD is not a variable in clause %qs", t, - omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is not a variable in clause %qs", t, + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); else - error ("%qE is not a variable in clause %qs", t, - omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE is not a variable in clause %qs", t, + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); remove = true; } else if (ort == C_ORT_ACC @@ -6109,7 +6119,9 @@ finish_omp_clauses (tree clauses, enum c { if (bitmap_bit_p (&oacc_reduction_head, DECL_UID (t))) { - error ("%qD appears more than once in reduction clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in reduction clauses", + t); remove = true; } else @@ -6119,16 +6131,19 @@ finish_omp_clauses (tree clauses, enum c || bitmap_bit_p (&firstprivate_head, DECL_UID (t)) || bitmap_bit_p (&lastprivate_head, DECL_UID (t))) { - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); remove = true; } else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE && bitmap_bit_p (&map_head, DECL_UID (t))) { if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears both in data and map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears both in data and map clauses", t); remove = true; } else @@ -6157,8 +6172,9 @@ finish_omp_clauses (tree clauses, enum c t = OMP_CLAUSE_DECL (c); if (ort != C_ORT_ACC && t == current_class_ptr) { - error ("%<this%> allowed in OpenMP only in %<declare simd%>" - " clauses"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<this%> allowed in OpenMP only in %<declare simd%>" + " clauses"); remove = true; break; } @@ -6169,23 +6185,30 @@ finish_omp_clauses (tree clauses, enum c if (processing_template_decl && TREE_CODE (t) != OVERLOAD) break; if (DECL_P (t)) - error ("%qD is not a variable in clause %<firstprivate%>", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is not a variable in clause %<firstprivate%>", + t); else - error ("%qE is not a variable in clause %<firstprivate%>", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE is not a variable in clause %<firstprivate%>", + t); remove = true; } else if (bitmap_bit_p (&generic_head, DECL_UID (t)) || bitmap_bit_p (&firstprivate_head, DECL_UID (t))) { - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); remove = true; } else if (bitmap_bit_p (&map_head, DECL_UID (t))) { if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears both in data and map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears both in data and map clauses", t); remove = true; } else @@ -6200,8 +6223,9 @@ finish_omp_clauses (tree clauses, enum c t = OMP_CLAUSE_DECL (c); if (t == current_class_ptr) { - error ("%<this%> allowed in OpenMP only in %<declare simd%>" - " clauses"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<this%> allowed in OpenMP only in %<declare simd%>" + " clauses"); remove = true; break; } @@ -6212,15 +6236,20 @@ finish_omp_clauses (tree clauses, enum c if (processing_template_decl && TREE_CODE (t) != OVERLOAD) break; if (DECL_P (t)) - error ("%qD is not a variable in clause %<lastprivate%>", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is not a variable in clause %<lastprivate%>", + t); else - error ("%qE is not a variable in clause %<lastprivate%>", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE is not a variable in clause %<lastprivate%>", + t); remove = true; } else if (bitmap_bit_p (&generic_head, DECL_UID (t)) || bitmap_bit_p (&lastprivate_head, DECL_UID (t))) { - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); remove = true; } else @@ -6257,7 +6286,8 @@ finish_omp_clauses (tree clauses, enum c else if (!type_dependent_expression_p (t) && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { - error ("%<gang%> static expression must be integral"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<gang%> static expression must be integral"); remove = true; } else @@ -6393,7 +6423,8 @@ finish_omp_clauses (tree clauses, enum c else if (!type_dependent_expression_p (t) && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { - error ("schedule chunk size expression must be integral"); + error_at (OMP_CLAUSE_LOCATION (c), + "schedule chunk size expression must be integral"); remove = true; } else @@ -6423,8 +6454,9 @@ finish_omp_clauses (tree clauses, enum c else if (!type_dependent_expression_p (t) && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { - error ("%qs length expression must be integral", - omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + error_at (OMP_CLAUSE_LOCATION (c), + "%qs length expression must be integral", + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); remove = true; } else @@ -6436,9 +6468,10 @@ finish_omp_clauses (tree clauses, enum c if (TREE_CODE (t) != INTEGER_CST || tree_int_cst_sgn (t) != 1) { - error ("%qs length expression must be positive constant" - " integer expression", - omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + error_at (OMP_CLAUSE_LOCATION (c), + "%qs length expression must be positive " + "constant integer expression", + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); remove = true; } } @@ -6455,7 +6488,8 @@ finish_omp_clauses (tree clauses, enum c else if (!type_dependent_expression_p (t) && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { - error ("%<async%> expression must be integral"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<async%> expression must be integral"); remove = true; } else @@ -6483,7 +6517,8 @@ finish_omp_clauses (tree clauses, enum c else if (!type_dependent_expression_p (t) && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { - error ("%<thread_limit%> expression must be integral"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<thread_limit%> expression must be integral"); remove = true; } else @@ -6512,7 +6547,8 @@ finish_omp_clauses (tree clauses, enum c else if (!type_dependent_expression_p (t) && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { - error ("%<device%> id must be integral"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<device%> id must be integral"); remove = true; } else @@ -6533,8 +6569,9 @@ finish_omp_clauses (tree clauses, enum c else if (!type_dependent_expression_p (t) && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { - error ("%<dist_schedule%> chunk size expression must be " - "integral"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<dist_schedule%> chunk size expression must be " + "integral"); remove = true; } else @@ -6550,8 +6587,9 @@ finish_omp_clauses (tree clauses, enum c t = OMP_CLAUSE_DECL (c); if (t == current_class_ptr && ort != C_ORT_OMP_DECLARE_SIMD) { - error ("%<this%> allowed in OpenMP only in %<declare simd%>" - " clauses"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<this%> allowed in OpenMP only in %<declare simd%>" + " clauses"); remove = true; break; } @@ -6560,9 +6598,11 @@ finish_omp_clauses (tree clauses, enum c if (processing_template_decl && TREE_CODE (t) != OVERLOAD) break; if (DECL_P (t)) - error ("%qD is not a variable in %<aligned%> clause", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is not a variable in %<aligned%> clause", t); else - error ("%qE is not a variable in %<aligned%> clause", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE is not a variable in %<aligned%> clause", t); remove = true; } else if (!type_dependent_expression_p (t) @@ -6580,7 +6620,9 @@ finish_omp_clauses (tree clauses, enum c } else if (bitmap_bit_p (&aligned_head, DECL_UID (t))) { - error ("%qD appears more than once in %<aligned%> clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in %<aligned%> clauses", + t); remove = true; } else @@ -6593,8 +6635,9 @@ finish_omp_clauses (tree clauses, enum c else if (!type_dependent_expression_p (t) && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { - error ("%<aligned%> clause alignment expression must " - "be integral"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<aligned%> clause alignment expression must " + "be integral"); remove = true; } else @@ -6606,8 +6649,9 @@ finish_omp_clauses (tree clauses, enum c if (TREE_CODE (t) != INTEGER_CST || tree_int_cst_sgn (t) != 1) { - error ("%<aligned%> clause alignment expression must be " - "positive constant integer expression"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<aligned%> clause alignment expression must " + "be positive constant integer expression"); remove = true; } } @@ -6622,15 +6666,20 @@ finish_omp_clauses (tree clauses, enum c if (processing_template_decl && TREE_CODE (t) != OVERLOAD) break; if (DECL_P (t)) - error ("%qD is not a variable in %<nontemporal%> clause", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is not a variable in %<nontemporal%> clause", + t); else - error ("%qE is not a variable in %<nontemporal%> clause", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE is not a variable in %<nontemporal%> clause", + t); remove = true; } else if (bitmap_bit_p (&oacc_reduction_head, DECL_UID (t))) { - error ("%qD appears more than once in %<nontemporal%> clauses", - t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in %<nontemporal%> " + "clauses", t); remove = true; } else @@ -6661,8 +6710,9 @@ finish_omp_clauses (tree clauses, enum c remove = true; else if (t == current_class_ptr) { - error ("%<this%> allowed in OpenMP only in %<declare simd%>" - " clauses"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<this%> allowed in OpenMP only in %<declare simd%>" + " clauses"); remove = true; } else if (processing_template_decl && TREE_CODE (t) != OVERLOAD) @@ -6670,11 +6720,13 @@ finish_omp_clauses (tree clauses, enum c else if (!lvalue_p (t)) { if (DECL_P (t)) - error ("%qD is not lvalue expression nor array section " - "in %<depend%> clause", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is not lvalue expression nor array section " + "in %<depend%> clause", t); else - error ("%qE is not lvalue expression nor array section " - "in %<depend%> clause", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE is not lvalue expression nor array section " + "in %<depend%> clause", t); remove = true; } else if (!cxx_mark_addressable (t)) @@ -6717,14 +6769,17 @@ finish_omp_clauses (tree clauses, enum c if (bitmap_bit_p (&map_head, DECL_UID (t))) { if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP) - error ("%qD appears more than once in motion" - " clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in motion" + " clauses", t); else if (ort == C_ORT_ACC) - error ("%qD appears more than once in data" - " clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data" + " clauses", t); else - error ("%qD appears more than once in map" - " clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in map" + " clauses", t); remove = true; } else @@ -6800,23 +6855,27 @@ finish_omp_clauses (tree clauses, enum c || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ALWAYS_POINTER)) break; if (DECL_P (t)) - error ("%qD is not a variable in %qs clause", t, - omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is not a variable in %qs clause", t, + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); else - error ("%qE is not a variable in %qs clause", t, - omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE is not a variable in %qs clause", t, + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); remove = true; } else if (VAR_P (t) && CP_DECL_THREAD_LOCAL_P (t)) { - error ("%qD is threadprivate variable in %qs clause", t, - omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is threadprivate variable in %qs clause", t, + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); remove = true; } else if (ort != C_ORT_ACC && t == current_class_ptr) { - error ("%<this%> allowed in OpenMP only in %<declare simd%>" - " clauses"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<this%> allowed in OpenMP only in %<declare simd%>" + " clauses"); remove = true; break; } @@ -6848,7 +6907,8 @@ finish_omp_clauses (tree clauses, enum c && !type_dependent_expression_p (t) && !POINTER_TYPE_P (TREE_TYPE (t))) { - error ("%qD is not a pointer variable", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is not a pointer variable", t); remove = true; } else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP @@ -6857,15 +6917,18 @@ finish_omp_clauses (tree clauses, enum c if (bitmap_bit_p (&generic_head, DECL_UID (t)) || bitmap_bit_p (&firstprivate_head, DECL_UID (t))) { - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); remove = true; } else if (bitmap_bit_p (&map_head, DECL_UID (t))) { if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears both in data and map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears both in data and map clauses", t); remove = true; } else @@ -6874,20 +6937,25 @@ finish_omp_clauses (tree clauses, enum c else if (bitmap_bit_p (&map_head, DECL_UID (t))) { if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP) - error ("%qD appears more than once in motion clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in motion clauses", t); if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears more than once in map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in map clauses", t); remove = true; } else if (bitmap_bit_p (&generic_head, DECL_UID (t)) || bitmap_bit_p (&firstprivate_head, DECL_UID (t))) { if (ort == C_ORT_ACC) - error ("%qD appears more than once in data clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears more than once in data clauses", t); else - error ("%qD appears both in data and map clauses", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD appears both in data and map clauses", t); remove = true; } else @@ -7002,9 +7070,11 @@ finish_omp_clauses (tree clauses, enum c if (processing_template_decl) break; if (DECL_P (t)) - error ("%qD is not an argument in %<uniform%> clause", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qD is not an argument in %<uniform%> clause", t); else - error ("%qE is not an argument in %<uniform%> clause", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE is not an argument in %<uniform%> clause", t); remove = true; break; } @@ -7019,7 +7089,8 @@ finish_omp_clauses (tree clauses, enum c else if (!type_dependent_expression_p (t) && !INTEGRAL_TYPE_P (TREE_TYPE (t))) { - error ("%<grainsize%> expression must be integral"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<grainsize%> expression must be integral"); remove = true; } else @@ -7190,8 +7261,9 @@ finish_omp_clauses (tree clauses, enum c case OMP_CLAUSE_NOTINBRANCH: if (branch_seen) { - error ("%<inbranch%> clause is incompatible with " - "%<notinbranch%>"); + error_at (OMP_CLAUSE_LOCATION (c), + "%<inbranch%> clause is incompatible with " + "%<notinbranch%>"); remove = true; } branch_seen = true; @@ -7342,7 +7414,8 @@ finish_omp_clauses (tree clauses, enum c case OMP_CLAUSE_COPYIN: if (!VAR_P (t) || !CP_DECL_THREAD_LOCAL_P (t)) { - error ("%qE must be %<threadprivate%> for %<copyin%>", t); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE must be %<threadprivate%> for %<copyin%>", t); remove = true; } break; @@ -7385,9 +7458,10 @@ finish_omp_clauses (tree clauses, enum c } if (share_name) { - error ("%qE is predetermined %qs for %qs", - omp_clause_printable_decl (t), share_name, - omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + error_at (OMP_CLAUSE_LOCATION (c), + "%qE is predetermined %qs for %qs", + omp_clause_printable_decl (t), share_name, + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); remove = true; } } --- gcc/testsuite/g++.dg/gomp/pr33372-1.C.jj 2017-05-04 15:05:46.019701375 +0200 +++ gcc/testsuite/g++.dg/gomp/pr33372-1.C 2018-06-01 17:21:31.605408118 +0200 @@ -8,8 +8,8 @@ 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" } +#pragma omp parallel for schedule(static, n) // { dg-error "chunk size expression must be integral" } + for (int i = 0; i < 10; i++) ; } --- gcc/testsuite/g++.dg/gomp/pr33372-3.C.jj 2017-05-04 15:05:46.038701132 +0200 +++ gcc/testsuite/g++.dg/gomp/pr33372-3.C 2018-06-01 17:17:16.820098624 +0200 @@ -8,8 +8,8 @@ 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" } +#pragma omp parallel for schedule(static, n) // { dg-error "chunk size expression must be integral" } + for (int i = 0; i < 10; i++) ; } Jakub