Support rvalue reference type in parser
authorArtemiy Volkov <artemiyv@acm.org>
Mon, 20 Mar 2017 20:47:43 +0000 (13:47 -0700)
committerKeith Seitz <keiths@redhat.com>
Mon, 20 Mar 2017 20:47:43 +0000 (13:47 -0700)
This patch implements correct parsing of C++11 rvalue reference typenames.
This is done in full similarity to the handling of regular references by adding
a '&&' token handling in c-exp.y, defining an rvalue reference type piece, and
implementing a follow type derivation in follow_types().

gdb/ChangeLog

PR gdb/14441
* c-exp.y (ptr_operator): Handle the '&&' token in the typename.
* parse.c (insert_type): Change assert statement.
(follow_types): Handle rvalue reference types.
* parser-defs.h (enum type_pieces) <tp_rvalue_reference>: New
constant.

gdb/ChangeLog
gdb/c-exp.y
gdb/parse.c
gdb/parser-defs.h

index 0645273ef1ea3886c13c077c010aad2225499ee8..5df48e5fffa3e57b0d43f8571f8a8477a9e14bf8 100644 (file)
@@ -1,3 +1,12 @@
+2017-03-20  Artemiy Volkov  <artemiyv@acm.org>
+
+       PR gdb/14441
+       * c-exp.y (ptr_operator): Handle the '&&' token in the typename.
+       * parse.c (insert_type): Change assert statement.
+       (follow_types): Handle rvalue reference types.
+       * parser-defs.h (enum type_pieces) <tp_rvalue_reference>: New
+       constant.
+
 2017-03-20  Artemiy Volkov  <artemiyv@acm.org>
 
        PR gdb/14441
index 2753c6ec5d17f308addc5e5753cb95be6d590719..7c25641738bebbf4167c57af79728a2d1ad23106 100644 (file)
@@ -744,7 +744,7 @@ exp :       SIZEOF '(' type ')'     %prec UNARY
                               says of sizeof:  "When applied to a reference
                               or a reference type, the result is the size of
                               the referenced type."  */
-                         if (TYPE_CODE (type) == TYPE_CODE_REF)
+                         if (TYPE_IS_REFERENCE (type))
                            type = check_typedef (TYPE_TARGET_TYPE (type));
                          write_exp_elt_longcst (pstate,
                                                 (LONGEST) TYPE_LENGTH (type));
@@ -1085,6 +1085,10 @@ ptr_operator:
                        { insert_type (tp_reference); }
        |       '&' ptr_operator
                        { insert_type (tp_reference); }
+       |       ANDAND
+                       { insert_type (tp_rvalue_reference); }
+       |       ANDAND ptr_operator
+                       { insert_type (tp_rvalue_reference); }
        ;
 
 ptr_operator_ts: ptr_operator
index 23c636f6c7e7db6427dbf246939ce5095efc2a89..3dd7075e55363f58ee93c2a5f82fa18e64b58da0 100644 (file)
@@ -1461,10 +1461,10 @@ insert_into_type_stack (int slot, union type_stack_elt element)
 }
 
 /* Insert a new type, TP, at the bottom of the type stack.  If TP is
-   tp_pointer or tp_reference, it is inserted at the bottom.  If TP is
-   a qualifier, it is inserted at slot 1 (just above a previous
-   tp_pointer) if there is anything on the stack, or simply pushed if
-   the stack is empty.  Other values for TP are invalid.  */
+   tp_pointer, tp_reference or tp_rvalue_reference, it is inserted at the
+   bottom.  If TP is a qualifier, it is inserted at slot 1 (just above a
+   previous tp_pointer) if there is anything on the stack, or simply pushed
+   if the stack is empty.  Other values for TP are invalid.  */
 
 void
 insert_type (enum type_pieces tp)
@@ -1473,7 +1473,8 @@ insert_type (enum type_pieces tp)
   int slot;
 
   gdb_assert (tp == tp_pointer || tp == tp_reference
-             || tp == tp_const || tp == tp_volatile);
+             || tp == tp_rvalue_reference || tp == tp_const
+             || tp == tp_volatile);
 
   /* If there is anything on the stack (we know it will be a
      tp_pointer), insert the qualifier above it.  Otherwise, simply
@@ -1686,18 +1687,22 @@ follow_types (struct type *follow_type)
        make_addr_space = 0;
        break;
       case tp_reference:
-       follow_type = lookup_lvalue_reference_type (follow_type);
-       if (make_const)
-         follow_type = make_cv_type (make_const, 
-                                     TYPE_VOLATILE (follow_type), 
-                                     follow_type, 0);
-       if (make_volatile)
-         follow_type = make_cv_type (TYPE_CONST (follow_type), 
-                                     make_volatile, 
-                                     follow_type, 0);
-       if (make_addr_space)
-         follow_type = make_type_with_address_space (follow_type, 
-                                                     make_addr_space);
+        follow_type = lookup_lvalue_reference_type (follow_type);
+        goto process_reference;
+       case tp_rvalue_reference:
+        follow_type = lookup_rvalue_reference_type (follow_type);
+       process_reference:
+        if (make_const)
+          follow_type = make_cv_type (make_const,
+                                      TYPE_VOLATILE (follow_type),
+                                      follow_type, 0);
+        if (make_volatile)
+          follow_type = make_cv_type (TYPE_CONST (follow_type),
+                                      make_volatile,
+                                      follow_type, 0);
+        if (make_addr_space)
+          follow_type = make_type_with_address_space (follow_type,
+                                                      make_addr_space);
        make_const = make_volatile = 0;
        make_addr_space = 0;
        break;
index 23757d97becc51059476968efd0c4c7795116e83..0913580d32dbc89cec23927870243880f88648a5 100644 (file)
@@ -127,6 +127,7 @@ enum type_pieces
     tp_end = -1, 
     tp_pointer, 
     tp_reference, 
+    tp_rvalue_reference,
     tp_array, 
     tp_function,
     tp_function_with_arguments,