[C++ PATCH] PR c++/92974 - bogus location for enum and non-enum in ?: warning.
Jason Merrill
jason@redhat.com
Fri Dec 20 22:57:00 GMT 2019
On 12/19/19 6:05 PM, Marek Polacek wrote:
> build_min_non_dep wasn't setting any location so when we were emitting the
> warning in the following test while instantiating a template, it's location
> was UNKNOWN_LOCATION. Rather than adding a location_t parameter, let's use
> the location from the original expression.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
>
> 2019-12-19 Marek Polacek <polacek@redhat.com>
>
> PR c++/92974 - bogus location for enum and non-enum in ?: warning.
> * tree.c (build_min_non_dep): Use the location of NON_DEP when
> building the expression.
OK.
> * g++.dg/diagnostic/enum1.C: New test.
> * g++.dg/gomp/loop-2.C: Adjust dg-error.
> * g++.dg/gomp/for-21.C: Likewise.
>
> diff --git gcc/cp/tree.c gcc/cp/tree.c
> index eb3e87fa546..df2470a750b 100644
> --- gcc/cp/tree.c
> +++ gcc/cp/tree.c
> @@ -3356,6 +3356,7 @@ build_min_non_dep (enum tree_code code, tree non_dep, ...)
> non_dep = TREE_OPERAND (non_dep, 0);
>
> t = make_node (code);
> + SET_EXPR_LOCATION (t, cp_expr_loc_or_input_loc (non_dep));
> length = TREE_CODE_LENGTH (code);
> TREE_TYPE (t) = unlowered_expr_type (non_dep);
> TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (non_dep);
> diff --git gcc/testsuite/g++.dg/diagnostic/enum1.C gcc/testsuite/g++.dg/diagnostic/enum1.C
> new file mode 100644
> index 00000000000..e91e970dab4
> --- /dev/null
> +++ gcc/testsuite/g++.dg/diagnostic/enum1.C
> @@ -0,0 +1,14 @@
> +// PR c++/92974 - bogus location for enum and non-enum in ?: warning.
> +// { dg-options "-Wextra" }
> +
> +enum { X };
> +
> +struct S {
> + template <typename T>
> + void f(T) { unsigned int g(X ?: g); } // { dg-warning "enumerated and non-enumerated type in conditional expression" }
> +};
> +
> +struct S2 {
> + S m;
> + void l() { m.f(1); }
> +};
> diff --git gcc/testsuite/g++.dg/gomp/for-21.C gcc/testsuite/g++.dg/gomp/for-21.C
> index 774f8889759..fbdaa71619a 100644
> --- gcc/testsuite/g++.dg/gomp/for-21.C
> +++ gcc/testsuite/g++.dg/gomp/for-21.C
> @@ -34,8 +34,8 @@ void
> f4 (int a[10][10])
> {
> #pragma omp for collapse (2)
> - for (int i = 0; i < 10; ++i) // { dg-error "initializer expression refers to iteration variable 'i'" }
> - for (auto j : a[i])
> + for (int i = 0; i < 10; ++i)
> + for (auto j : a[i]) // { dg-error "initializer expression refers to iteration variable 'i'" }
> ;
> }
>
> diff --git gcc/testsuite/g++.dg/gomp/loop-2.C gcc/testsuite/g++.dg/gomp/loop-2.C
> index f05a8cbdd4a..9deeaa5d887 100644
> --- gcc/testsuite/g++.dg/gomp/loop-2.C
> +++ gcc/testsuite/g++.dg/gomp/loop-2.C
> @@ -87,16 +87,16 @@ f1 (int x)
> for (j = baz (&i); j < 16; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> - for (i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
> - for (j = 16; j > (i & x); j--)
> + for (i = 0; i < 16; i++)
> + for (j = 16; j > (i & x); j--) /* { dg-error "condition expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> - for (i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
> - for (j = 0; j < i; j++)
> + for (i = 0; i < 16; i++)
> + for (j = 0; j < i; j++) /* { dg-error "condition expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> - for (i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
> - for (j = 0; j < i + 4; j++)
> + for (i = 0; i < 16; i++)
> + for (j = 0; j < i + 4; j++) /* { dg-error "condition expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> for (i = 0; i < j + 4; i++) /* { dg-error "condition expression refers to iteration variable" } */
> @@ -111,8 +111,8 @@ f1 (int x)
> for (j = 0; j < 16; j++)
> ;
> #pragma omp for collapse(2)
> - for (i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
> - for (j = 0; j < baz (&i); j++)
> + for (i = 0; i < 16; i++)
> + for (j = 0; j < baz (&i); j++) /* { dg-error "condition expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> for (i = 0; i < 16; i += j) /* { dg-error "increment expression refers to iteration variable" } */
> @@ -221,20 +221,20 @@ f2 (int x)
> for (int j = baz (&i); j < 16; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> - for (int i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
> - for (int j = 16; j > (i & x); j--)
> + for (int i = 0; i < 16; i++)
> + for (int j = 16; j > (i & x); j--) /* { dg-error "condition expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> - for (int i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
> - for (int j = 0; j < i; j++)
> + for (int i = 0; i < 16; i++)
> + for (int j = 0; j < i; j++) /* { dg-error "condition expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> - for (int i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
> - for (int j = 0; j < i + 4; j++)
> + for (int i = 0; i < 16; i++)
> + for (int j = 0; j < i + 4; j++) /* { dg-error "condition expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> - for (int i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
> - for (int j = 0; j < baz (&i); j++)
> + for (int i = 0; i < 16; i++)
> + for (int j = 0; j < baz (&i); j++) /* { dg-error "condition expression refers to iteration variable" } */
> ;
> #pragma omp for collapse(2)
> for (int i = 0; i < 16; i++) /* { dg-error "increment expression refers to iteration variable" } */
>
More information about the Gcc-patches
mailing list