diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b72121c460b01..1552b3ef1c5d3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2019-12-19 Marek Polacek + + 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. + 2019-12-20 Jakub Jelinek PR c++/92965 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index eb3e87fa54602..df2470a750b9a 100644 --- a/gcc/cp/tree.c +++ b/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 a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9913e8abd0a8d..a7835dbd27801 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2019-12-19 Marek Polacek + + PR c++/92974 - bogus location for enum and non-enum in ?: warning. + * g++.dg/diagnostic/enum1.C: New test. + * g++.dg/gomp/loop-2.C: Adjust dg-error. + * g++.dg/gomp/for-21.C: Likewise. + 2019-12-20 Jakub Jelinek PR c++/92965 diff --git a/gcc/testsuite/g++.dg/diagnostic/enum1.C b/gcc/testsuite/g++.dg/diagnostic/enum1.C new file mode 100644 index 0000000000000..e91e970dab476 --- /dev/null +++ b/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 + 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 a/gcc/testsuite/g++.dg/gomp/for-21.C b/gcc/testsuite/g++.dg/gomp/for-21.C index 774f888975934..fbdaa71619a61 100644 --- a/gcc/testsuite/g++.dg/gomp/for-21.C +++ b/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 a/gcc/testsuite/g++.dg/gomp/loop-2.C b/gcc/testsuite/g++.dg/gomp/loop-2.C index f05a8cbdd4a34..9deeaa5d8874a 100644 --- a/gcc/testsuite/g++.dg/gomp/loop-2.C +++ b/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" } */