From e1389417f9bc364b49f8bef9583e34a8db3a4049 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 21 Nov 2018 23:41:07 +0100 Subject: [PATCH] re PR c++/87386 (Error message for static_assert show wrong range) PR c++/87386 * parser.c (cp_parser_primary_expression): Use id_expression.get_location () instead of id_expr_token->location. Adjust the range from id_expr_token->location to id_expressio.get_finish (). (cp_parser_operator_function_id): Pass location of the operator token down to cp_parser_operator. (cp_parser_operator): Add start_loc argument, always construct a location with caret at start_loc and range from start_loc to the finish of the last token. gcc/testsuite/ * g++.dg/diagnostic/pr87386.C: New test. * g++.dg/parse/error17.C: Adjust expected diagnostics. libstdc++-v3/ * testsuite/20_util/scoped_allocator/69293_neg.cc: Adjust expected line. * testsuite/20_util/uses_allocator/cons_neg.cc: Likewise. * testsuite/20_util/uses_allocator/69293_neg.cc: Likewise. * testsuite/experimental/propagate_const/requirements2.cc: Likewise. * testsuite/experimental/propagate_const/requirements3.cc: Likewise. * testsuite/experimental/propagate_const/requirements4.cc: Likewise. * testsuite/experimental/propagate_const/requirements5.cc: Likewise. From-SVN: r266359 --- gcc/cp/ChangeLog | 11 +++++ gcc/cp/parser.c | 40 ++++++++++++------- gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/g++.dg/diagnostic/pr87386.C | 18 +++++++++ gcc/testsuite/g++.dg/parse/error17.C | 2 +- libstdc++-v3/ChangeLog | 12 ++++++ .../20_util/scoped_allocator/69293_neg.cc | 2 +- .../20_util/uses_allocator/69293_neg.cc | 2 +- .../20_util/uses_allocator/cons_neg.cc | 2 +- .../propagate_const/requirements2.cc | 2 +- .../propagate_const/requirements3.cc | 2 +- .../propagate_const/requirements4.cc | 2 +- .../propagate_const/requirements5.cc | 2 +- 13 files changed, 79 insertions(+), 22 deletions(-) create mode 100644 gcc/testsuite/g++.dg/diagnostic/pr87386.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0da294c6b9b..9305d530adf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,16 @@ 2018-11-21 Jakub Jelinek + PR c++/87386 + * parser.c (cp_parser_primary_expression): Use + id_expression.get_location () instead of id_expr_token->location. + Adjust the range from id_expr_token->location to + id_expressio.get_finish (). + (cp_parser_operator_function_id): Pass location of the operator + token down to cp_parser_operator. + (cp_parser_operator): Add start_loc argument, always construct a + location with caret at start_loc and range from start_loc to the + finish of the last token. + PR c++/87393 * parser.c (cp_parser_linkage_specification): Remove useless dereference of the consume_open method result. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 09b2b00b438..e3569b2ecef 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2312,7 +2312,7 @@ static tree cp_parser_mem_initializer_id static cp_expr cp_parser_operator_function_id (cp_parser *); static cp_expr cp_parser_operator - (cp_parser *); + (cp_parser *, location_t); /* Templates [gram.temp] */ @@ -5604,7 +5604,7 @@ cp_parser_primary_expression (cp_parser *parser, /*is_namespace=*/false, /*check_dependency=*/true, &ambiguous_decls, - id_expr_token->location); + id_expression.get_location ()); /* If the lookup was ambiguous, an error will already have been issued. */ if (ambiguous_decls) @@ -5675,7 +5675,7 @@ cp_parser_primary_expression (cp_parser *parser, if (parser->local_variables_forbidden_p && local_variable_p (decl)) { - error_at (id_expr_token->location, + error_at (id_expression.get_location (), "local variable %qD may not appear in this context", decl.get_value ()); return error_mark_node; @@ -5694,7 +5694,8 @@ cp_parser_primary_expression (cp_parser *parser, id_expression.get_location ())); if (error_msg) cp_parser_error (parser, error_msg); - decl.set_location (id_expr_token->location); + decl.set_location (id_expression.get_location ()); + decl.set_range (id_expr_token->location, id_expression.get_finish ()); return decl; } @@ -15011,11 +15012,12 @@ cp_parser_mem_initializer_id (cp_parser* parser) static cp_expr cp_parser_operator_function_id (cp_parser* parser) { + location_t start_loc = cp_lexer_peek_token (parser->lexer)->location; /* Look for the `operator' keyword. */ if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR)) return error_mark_node; /* And then the name of the operator itself. */ - return cp_parser_operator (parser); + return cp_parser_operator (parser, start_loc); } /* Return an identifier node for a user-defined literal operator. @@ -15049,7 +15051,7 @@ cp_literal_operator_id (const char* name) human-readable spelling of the identifier, e.g., `operator +'. */ static cp_expr -cp_parser_operator (cp_parser* parser) +cp_parser_operator (cp_parser* parser, location_t start_loc) { tree id = NULL_TREE; cp_token *token; @@ -15058,7 +15060,7 @@ cp_parser_operator (cp_parser* parser) /* Peek at the next token. */ token = cp_lexer_peek_token (parser->lexer); - location_t start_loc = token->location; + location_t end_loc = token->location; /* Figure out which operator we have. */ enum tree_code op = ERROR_MARK; @@ -15077,7 +15079,7 @@ cp_parser_operator (cp_parser* parser) break; /* Consume the `new' or `delete' token. */ - location_t end_loc = cp_lexer_consume_token (parser->lexer)->location; + end_loc = cp_lexer_consume_token (parser->lexer)->location; /* Peek at the next token. */ token = cp_lexer_peek_token (parser->lexer); @@ -15093,7 +15095,6 @@ cp_parser_operator (cp_parser* parser) end_loc = close_token->location; op = op == NEW_EXPR ? VEC_NEW_EXPR : VEC_DELETE_EXPR; } - start_loc = make_location (start_loc, start_loc, end_loc); consumed = true; break; } @@ -15259,7 +15260,9 @@ cp_parser_operator (cp_parser* parser) matching_parens parens; parens.consume_open (parser); /* Look for the matching `)'. */ - parens.require_close (parser); + token = parens.require_close (parser); + if (token) + end_loc = token->location; op = CALL_EXPR; consumed = true; break; @@ -15269,7 +15272,9 @@ cp_parser_operator (cp_parser* parser) /* Consume the `['. */ cp_lexer_consume_token (parser->lexer); /* Look for the matching `]'. */ - cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE); + token = cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE); + if (token) + end_loc = token->location; op = ARRAY_REF; consumed = true; break; @@ -15287,7 +15292,8 @@ cp_parser_operator (cp_parser* parser) case CPP_STRING16_USERDEF: case CPP_STRING32_USERDEF: { - tree str, string_tree; + cp_expr str; + tree string_tree; int sz, len; if (cxx_dialect == cxx98) @@ -15302,6 +15308,7 @@ cp_parser_operator (cp_parser* parser) { string_tree = USERDEF_LITERAL_VALUE (str); id = USERDEF_LITERAL_SUFFIX_ID (str); + end_loc = str.get_location (); } else { @@ -15309,7 +15316,10 @@ cp_parser_operator (cp_parser* parser) /* Look for the suffix identifier. */ token = cp_lexer_peek_token (parser->lexer); if (token->type == CPP_NAME) - id = cp_parser_identifier (parser); + { + id = cp_parser_identifier (parser); + end_loc = token->location; + } else if (token->type == CPP_KEYWORD) { error ("unexpected keyword;" @@ -15341,7 +15351,8 @@ cp_parser_operator (cp_parser* parser) const char *name = IDENTIFIER_POINTER (id); id = cp_literal_operator_id (name); } - return id; + start_loc = make_location (start_loc, start_loc, get_finish (end_loc)); + return cp_expr (id, start_loc); } default: @@ -15364,6 +15375,7 @@ cp_parser_operator (cp_parser* parser) id = error_mark_node; } + start_loc = make_location (start_loc, start_loc, get_finish (end_loc)); return cp_expr (id, start_loc); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d43adb469ea..bb61952588a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2018-11-21 Jakub Jelinek + PR c++/87386 + * g++.dg/diagnostic/pr87386.C: New test. + * g++.dg/parse/error17.C: Adjust expected diagnostics. + PR rtl-optimization/85925 * gcc.c-torture/execute/20181120-1.c: Require effective target int32plus. diff --git a/gcc/testsuite/g++.dg/diagnostic/pr87386.C b/gcc/testsuite/g++.dg/diagnostic/pr87386.C new file mode 100644 index 00000000000..85726af9f01 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/pr87386.C @@ -0,0 +1,18 @@ +// PR c++/87386 +// { dg-do compile { target c++11 } } +// { dg-options "-fdiagnostics-show-caret" } + +namespace foo { + template struct test { static constexpr bool value = false; }; +} +static_assert (foo::test::value, "foo"); // { dg-error "static assertion failed: foo" } +/* { dg-begin-multiline-output "" } + static_assert (foo::test::value, "foo"); + ~~~~~~~~~~~~~~~~^~~~~ + { dg-end-multiline-output "" } */ + +static_assert (foo::test::value && true, "bar"); // { dg-error "static assertion failed: bar" } +/* { dg-begin-multiline-output "" } + static_assert (foo::test::value && true, "bar"); + ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~ + { dg-end-multiline-output "" } */ diff --git a/gcc/testsuite/g++.dg/parse/error17.C b/gcc/testsuite/g++.dg/parse/error17.C index b308c912f1e..051ffa332c2 100644 --- a/gcc/testsuite/g++.dg/parse/error17.C +++ b/gcc/testsuite/g++.dg/parse/error17.C @@ -6,4 +6,4 @@ template struct B { }; struct D : B, B {}; -int i2 = D::Bar(2); // { dg-error "10:reference to 'Bar' is ambiguous" } +int i2 = D::Bar(2); // { dg-error "13:reference to 'Bar' is ambiguous" } diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0ad33dac1ba..a77596e784e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2018-11-21 Jakub Jelinek + + PR c++/87386 + * testsuite/20_util/scoped_allocator/69293_neg.cc: Adjust expected + line. + * testsuite/20_util/uses_allocator/cons_neg.cc: Likewise. + * testsuite/20_util/uses_allocator/69293_neg.cc: Likewise. + * testsuite/experimental/propagate_const/requirements2.cc: Likewise. + * testsuite/experimental/propagate_const/requirements3.cc: Likewise. + * testsuite/experimental/propagate_const/requirements4.cc: Likewise. + * testsuite/experimental/propagate_const/requirements5.cc: Likewise. + 2018-11-21 Jonathan Wakely PR libstdc++/88111 diff --git a/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc b/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc index 168079fd5f9..638d8dae593 100644 --- a/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc +++ b/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc @@ -46,5 +46,5 @@ test01() scoped_alloc sa; auto p = sa.allocate(1); sa.construct(p); // this is required to be ill-formed - // { dg-error "static assertion failed" "" { target *-*-* } 94 } + // { dg-error "static assertion failed" "" { target *-*-* } 96 } } diff --git a/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc b/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc index eaf432491c6..0f16cd60fb3 100644 --- a/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc +++ b/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc @@ -44,5 +44,5 @@ test01() { alloc_type a; std::tuple t(std::allocator_arg, a); // this is required to be ill-formed - // { dg-error "static assertion failed" "" { target *-*-* } 94 } + // { dg-error "static assertion failed" "" { target *-*-* } 96 } } diff --git a/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc b/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc index bb8c38d1e49..73ed2b58aa1 100644 --- a/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc +++ b/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc @@ -43,4 +43,4 @@ void test01() tuple t(allocator_arg, a, 1); } -// { dg-error "static assertion failed" "" { target *-*-* } 94 } +// { dg-error "static assertion failed" "" { target *-*-* } 96 } diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc index fa5193eaf9c..0c48ac967dd 100644 --- a/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc +++ b/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc @@ -21,7 +21,7 @@ using std::experimental::propagate_const; -// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 105 } +// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 107 } // { dg-error "not a pointer-to-object type" "" { target *-*-* } 66 } // { dg-error "forming pointer to reference type" "" { target *-*-* } 187 } // { dg-error "forming pointer to reference type" "" { target *-*-* } 213 } diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc index fc7c30f5693..63aebef47b6 100644 --- a/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc +++ b/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc @@ -21,6 +21,6 @@ using std::experimental::propagate_const; -// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 105 } +// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 107 } propagate_const test1; diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc index 65cee4e5e14..50303c9ee0b 100644 --- a/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc +++ b/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc @@ -21,7 +21,7 @@ using std::experimental::propagate_const; -// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 105 } +// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 107 } // { dg-error "invalid type" "" { target *-*-* } 66 } // { dg-error "uninitialized reference member" "" { target *-*-* } 112 } diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc index ae98fb87da1..b80600ea957 100644 --- a/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc +++ b/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc @@ -21,6 +21,6 @@ using std::experimental::propagate_const; -// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 105 } +// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 107 } propagate_const test1;