Expressions Specific to C++

This section gives information on the following C++ support features:

C++ is a complex language, with a rich expression system. The debugger understands much of the system, but it does not understand how to evaluate some complex aspects of a C++ expression. It can correctly debug these when they occur in the source code.

The aspects of the expression system not processed properly during debugger expression evaluation include the following:

There are also some minor restrictions in the following grammar, compared with the full C++ expression grammar, to make it unambiguous:

expression

: assignment-expression

constant-expression

: conditional-expression

C++ Identifiers

The debugger correctly augments the general lookup rules when inside class member functions, to look up the members correctly.

The debugger has only a limited understanding of namespaces. It correctly processes names such as UserNameSpace::NestedNamespace::userIdentifier, as well as C++ use-declarations, which introduce a new identifier into a scope.

The debugger does not currently understand C++ using-directives.

The debugger understands the relationship between struct and class identifiers and typedef identifiers.

id-or-keyword-or-typedef-name

: identifier-or-key-word

| TYPEDEFname

C++ Constants

The debugger treats numeric constants the same as C++ does. The enumeration constant identifiers go though the same grammar paths as variable identifiers, which has basically the same effect as the C++ semantics.

constant

: FLOATINGconstant

| INTEGERconstant

| CHARACTERconstant

| WIDECHARACTERconstant

| WIDESTRINGliteral

C++ Calls

The debugger does not understand the following aspects of C++ calls:

call-expression

: expression

Restrictions and limits are documented here.

C++ Addresses

address

: AMPERSAND postfix-expression /* Address of */

| line-address

| postfix-expression

address-exp

: address

| address-exp PLUS  address

| address-exp MINUS address

| address-exp STAR  address

C++ Loc

loc

: expression

| rescoped-expression

Other Modified Forms of C++ Expressions

whatis-expressions

: expression

| printable-type

C++ Rescoped Expressions

qual-typedef-opt

: type-name

| qual-typedef-opt TICK type-name

C++ Strings

string-literal-list

: string

| string-literal-list string

C++ Identifier Expressions

The debugger understands nested names. Namespaces go through the same paths as classes, hence the unusual use of TYPEDEFname.

id-expression

: id-expression-internals

id-expression-internals

: qualified-id

| id-or-keyword-or-typedef-name

| operator-function-name

| TWIDDLE id-or-keyword-or-typedef-name

qualified-id

: nested-name-specifier qualified-id-follower

qualified-type

: nested-name-specifier TYPEDEFname

nested-name-specifier

: CLCL

| TYPEDEFname CLCL

| nested-name-specifier TYPEDEFname CLCL

qualified-id-follower

: identifier-or-key-word

| operator-function-name

| TWIDDLE id-or-keyword-or-typedef-name

C++ Types

The debugger understands the full C++ type specification grammar.

type-specifier

: basic-type-specifier

| struct-union-enum-type-specifier

| typedef-type-specifier

type-qualifier-list

: type-qualifier

| type-qualifier-list type-qualifier

type-qualifier

: CONST

| VOLATILE

| LE

| _le

| _be

basic-type-specifier

: basic-type-name basic-type-name

| basic-type-name type-qualifier

| type-qualifier-list basic-type-name

| basic-type-specifier type-qualifier

| basic-type-specifier basic-type-name

struct-union-enum-type-specifier

: elaborated-type-name

| type-qualifier-list elaborated-type-name

| struct-union-enum-type-specifier type-qualifier

typedef-type-specifier

: TYPEDEFname type-qualifier

| type-qualifier-list TYPEDEFname

| typedef-type-specifier type-qualifier

basic-type-name

: VOID

| CHAR

| SHORT

| INT

| LONG

| FLOAT

| DOUBLE

| SIGNED

| UNSIGNED

elaborated-type-name

: aggregate-name

| enum-name

printable-type

: rescoped-typedef

| type-name

aggregate-name

: aggregate-key opt-parenthesized-identifier-or-typedef-name

| aggregate-key qualified-type

opt-parenthesized-identifier-or-typedef-name

: id-or-keyword-or-typedef-name

| LPAREN opt-parenthesized-identifier-or-typedef-name RPAREN

aggregate-key

: STRUCT

| UNION

| CLASS

enum-name

: ENUM id-or-keyword-or-typedef-name

parameter-type-list

: PARENS type-qualifier-list-opt

type-name

: type-specifier

| qualified-type

| basic-type-name

| TYPEDEFname

| type-qualifier-list

| type-specifier abstract-declarator

| basic-type-name abstract-declarator

| qualified-type abstract-declarator

| TYPEDEFname abstract-declarator

| type-qualifier-list abstract-declarator

abstract-declarator

: unary-abstract-declarator

| postfix-abstract-declarator

| postfixing-abstract-declarator

postfixing-abstract-declarator

: array-abstract-declarator

| parameter-type-list

array-abstract-declarator

: BRACKETS

| LBRACKET constant-expression RBRACKET

| array-abstract-declarator LBRACKET constant-expression RBRACKET

unary-abstract-declarator

: STAR

| AMPERSAND

| pointer-operator-type

| STAR                  abstract-declarator

| AMPERSAND             abstract-declarator

| pointer-operator-type abstract-declarator

postfix-abstract-declarator

: LPAREN unary-abstract-declarator RPAREN

| LPAREN postfix-abstract-declarator RPAREN

| LPAREN postfixing-abstract-declarator RPAREN

| LPAREN unary-abstract-declarator RPAREN postfixing-abstract-declarator

pointer-operator-type

: TYPEDEFname CLCL STAR type-qualifier-list-opt

| STAR                  type-qualifier-list

| AMPERSAND             type-qualifier-list

Other Forms of C++ Expressions

The following expressions all have the usual C++ semantics:

primary-expression

: constant

| string-literal-list

| THIS

| LPAREN expression RPAREN

| operator-function-name

| identifier-or-key-word

| qualified-id

| process_set

| LPAREN process_range RPAREN

operator-function-name

: OPERATOR operator-predefined

| OPERATOR basic-type-name

| OPERATOR TYPEDEFname

| OPERATOR LPAREN type-name RPAREN

| OPERATOR type-qualifier

| OPERATOR qualified-type

operator-predefined

: PLUS

| MINUS

| STAR

| ...

| DELETE

| COMMA

type-qualifier-list-opt

: [ type-qualifier-list ]

postfix-expression

: primary-expression

| primary-expression LBRACKET expression RBRACKET

| postfix-expression PARENS

| postfix-expression LPAREN  argument-expression-list RPAREN

| postfix-expression LPAREN  type-name-list RPAREN

| postfix-expression DOT  id-expression

| postfix-expression ARROW id-expression

| postfix-expression INCR

| postfix-expression DECR

| TYPEDEFname LPAREN argument-expression-list RPAREN

| TYPEDEFname LPAREN type-name-list RPAREN

| basic-type-name LPAREN assignment-expression RPAREN

type-name-list

: type-name

| type-name COMMA type-name-list

| type-name comma-opt-ellipsis

| ELLIPSIS

comma-opt-ellipsis

: ELLIPSIS

| COMMA ELLIPSIS

unary-expression

: postfix-expression

| INCR unary-expression

| DECR unary-expression

| line-address

| AMPERSAND cast-expression

| STAR cast-expression

| MINUS cast-expression

| PLUS cast-expression

| TWIDDLE LPAREN cast-expression RPAREN

| NOT cast-expression

| SIZEOF unary-expression

| SIZEOF LPAREN type-name RPAREN

| allocation-expression

allocation-expression

: operator-new LPAREN type-name RPAREN operator-new-initializer

| operator-new LPAREN argument-expression-list RPAREN LPAREN type-name RPAREN operator-new-initializer

operator-new

: NEW

| CLCL NEW

operator-new-initializer

: [ PARENS ]

| [ LPAREN argument-expression-list RPAREN ]

cast-expression

: unary-expression

| LPAREN type-name RPAREN cast-expression

deallocation-expression

: cast-expression

| DELETE               deallocation-expression

| CLCL DELETE          deallocation-expression

| DELETE BRACKETS      deallocation-expression

| CLCL DELETE BRACKETS deallocation-expression

point-member-expression

: deallocation-expression

| point-member-expression DOTstar    deallocation-expression

| point-member-expression ARROWstar  deallocation-expression

multiplicative-expression

: point-member-expression

| multiplicative-expression STAR  point-member-expression

| multiplicative-expression SLASH point-member-expression

| multiplicative-expression MOD   point-member-expression

additive-expression

: multiplicative-expression

| additive-expression PLUS  multiplicative-expression

| additive-expression MINUS multiplicative-expression

shift-expression

: additive-expression

| shift-expression LS additive-expression

| shift-expression RS additive-expression

relational-expression

: shift-expression

| relational-expression LESS    shift-expression

| relational-expression GREATER shift-expression

| relational-expression LE      shift-expression

| relational-expression GE     shift-expression

equality-expression

: relational-expression

| equality-expression EQ relational-expression

| equality-expression NE relational-expression

AND-expression

: equality-expression

| AND-expression AMPERSAND equality-expression

exclusive-OR-expression

: AND-expression

| exclusive-OR-expression HAT AND-expression

inclusive-OR-expression

: exclusive-OR-expression

| inclusive-OR-expression OR exclusive-OR-expression

logical-AND-expression

: inclusive-OR-expression

| logical-AND-expression ANDAND inclusive-OR-expression

logical-OR-expression

: logical-AND-expression

| logical-OR-expression OROR logical-AND-expression

conditional-expression

: logical-AND-expression

| logical-AND-expression QUESTION expression COLON conditional-expression

assignment-expression

: conditional-expression

| unary-expression ASSIGNOP    assignment-expression

| unary-expression MULTassign  assignment-expression

| unary-expression DIVassign   assignment-expression

| unary-expression MODassign   assignment-expression

| unary-expression PLUSassign  assignment-expression

| unary-expression MINUSassign assignment-expression

| unary-expression LSassign    assignment-expression

| unary-expression RSassign    assignment-expression

| unary-expression ANDassign   assignment-expression

| unary-expression ERassign    assignment-expression

| unary-expression ORassign    assignment-expression