re PR c++/87386 (Error message for static_assert show wrong range)
authorJakub Jelinek <jakub@redhat.com>
Wed, 21 Nov 2018 22:41:07 +0000 (23:41 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 21 Nov 2018 22:41:07 +0000 (23:41 +0100)
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

13 files changed:
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/diagnostic/pr87386.C [new file with mode: 0644]
gcc/testsuite/g++.dg/parse/error17.C
libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc
libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc
libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc
libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc
libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc
libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc
libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc

index 0da294c6b9b51a1adee8a2c0ef34cf746a3dba7a..9305d530adfd057ced6b65d2f072a8e2e4653271 100644 (file)
@@ -1,5 +1,16 @@
 2018-11-21  Jakub Jelinek  <jakub@redhat.com>
 
+       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.
index 09b2b00b438ae1225bff9200020eafff69b6e23d..e3569b2ecefd1b13ac01b9c3340bd7c234ad6c47 100644 (file)
@@ -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);
 }
 
index d43adb469ea35b9d1085022c730d407506f37430..bb61952588a3f21b0e679b0dae79ca11f9fe799a 100644 (file)
@@ -1,5 +1,9 @@
 2018-11-21  Jakub Jelinek  <jakub@redhat.com>
 
+       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 (file)
index 0000000..85726af
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/87386
+// { dg-do compile { target c++11 } }
+// { dg-options "-fdiagnostics-show-caret" }
+
+namespace foo {
+  template<typename> struct test { static constexpr bool value = false; };
+}
+static_assert (foo::test<int>::value, "foo");          // { dg-error "static assertion failed: foo" }
+/* { dg-begin-multiline-output "" }
+ static_assert (foo::test<int>::value, "foo");
+                ~~~~~~~~~~~~~~~~^~~~~
+   { dg-end-multiline-output "" } */
+
+static_assert (foo::test<int>::value && true, "bar");  // { dg-error "static assertion failed: bar" }
+/* { dg-begin-multiline-output "" }
+ static_assert (foo::test<int>::value && true, "bar");
+                ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
+   { dg-end-multiline-output "" } */
index b308c912f1e8efdfb990ed0d1d18607edf324c2c..051ffa332c2c22329f0c78d1b7a9cc9e51eaf8f7 100644 (file)
@@ -6,4 +6,4 @@ template <typename T> struct B {
 }; 
 struct D : B<int>, B<char> {}; 
  
-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" }
index 0ad33dac1ba78be2c2c188b7a3f2be2094566fcf..a77596e784e97094ec06edf6f93178ec1475df20 100644 (file)
@@ -1,3 +1,15 @@
+2018-11-21  Jakub Jelinek  <jakub@redhat.com>
+
+       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  <jwakely@redhat.com>
 
        PR libstdc++/88111
index 168079fd5f936fea0a1957d5716cc6e3bab7cda1..638d8dae593346d3823e837e0f9246f09280309e 100644 (file)
@@ -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 }
 }
index eaf432491c673cd3ab36529fb9df383b319285a7..0f16cd60fb3c6fb6eb86833a460869548d252a5c 100644 (file)
@@ -44,5 +44,5 @@ test01()
 {
   alloc_type a;
   std::tuple<X> 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 }
 }
index bb8c38d1e49ae88a122ee8a7e3b608170aa6a8d2..73ed2b58aa1570af83caa640ee181b578af27b86 100644 (file)
@@ -43,4 +43,4 @@ void test01()
 
   tuple<Type> t(allocator_arg, a, 1);
 }
-// { dg-error "static assertion failed" "" { target *-*-* } 94 }
+// { dg-error "static assertion failed" "" { target *-*-* } 96 }
index fa5193eaf9cc409bc1fac0a4d933d1145d9b496a..0c48ac967dd5fb722b44eac586ea8edb9107b185 100644 (file)
@@ -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 }
index fc7c30f5693b592d1424593ddff1c976ebe5495c..63aebef47b6a58e9ce6082cf446ec20152e5e87a 100644 (file)
@@ -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<void (*)()> test1;
index 65cee4e5e14f0c4ae271c05461ca331821fe0741..50303c9ee0beb667f47f411b2e806251230597b0 100644 (file)
@@ -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 }
 
index ae98fb87da1fe51ea4898ef004297444b8de7ddf..b80600ea957b5c4d5cc223d8859181c8cb6f6922 100644 (file)
@@ -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<int[1]> test1;