* cp-name-parser.y (exp1): Add & ( var ) as a reference expression.
authorDaniel Jacobowitz <drow@false.org>
Mon, 22 Oct 2007 16:07:13 +0000 (16:07 +0000)
committerDaniel Jacobowitz <drow@false.org>
Mon, 22 Oct 2007 16:07:13 +0000 (16:07 +0000)
(exp): Remove and document function-like casts.

gdb/ChangeLog
gdb/cp-name-parser.y

index c66a8c7b39667d15a60494fb7a8d667ee1cf9e2e..9ee7a1be5647897d72f7f53a15f646de136d86cd 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-22  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * cp-name-parser.y (exp1): Add & ( var ) as a reference expression.
+       (exp): Remove and document function-like casts.
+
 2007-10-22  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * cp-support.c: Include "safe-ctype.h".
index 0eab4f2120ebd15d6d6faeb89427169fa697e266..b4597ec6c744dd51023169ae98d228ce606a3371 100644 (file)
@@ -1011,6 +1011,8 @@ exp1      :       exp '>' exp
    in parentheses.  */
 exp1   :       '&' start
                { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $2); }
+       |       '&' '(' start ')'
+               { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $3); }
        ;
 
 /* Expressions, not including the comma operator.  */
@@ -1066,18 +1068,13 @@ exp     :       REINTERPRET_CAST '<' type '>' '(' exp1 ')' %prec UNARY
                }
        ;
 
-/* Another form of C++-style cast.  "type ( exp1 )" is not allowed (it's too
-   ambiguous), but "name ( exp1 )" is.  Because we don't need to support
-   function types, we can handle this unambiguously (the use of typespec_2
-   prevents a silly, harmless conflict with qualifiers_opt).  This does not
-   appear in demangler output so it's not a great loss if we need to
-   disable it.  */
-exp    :       typespec_2 '(' exp1 ')' %prec UNARY
-               { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
-                                   fill_comp (DEMANGLE_COMPONENT_CAST, $1, NULL),
-                                   $3);
-               }
-       ;
+/* Another form of C++-style cast is "type ( exp1 )".  This creates too many
+   conflicts to support.  For a while we supported the simpler
+   "typespec_2 ( exp1 )", but that conflicts with "& ( start )" as a
+   reference, deep within the wilderness of abstract declarators:
+   Qux<int(&(*))> vs Qux<int(&(var))>, a shift-reduce conflict at the
+   innermost left parenthesis.  So we do not support function-like casts.
+   Fortunately they never appear in demangler output.  */
 
 /* TO INVESTIGATE: ._0 style anonymous names; anonymous namespaces */