StartSymbol: Translation-unit
StartSymbol
         ::= Translation-unit
no referencesTypedef-name: Identifier
Typedef-name
         ::= Identifier
referenced by: Type-name Namespace-name: Original-namespace-name
         ::= Original-namespace-name
referenced by: Nested-name-specifier Qualified-namespace-specifier Using-directive Original-namespace-name: Identifier
         ::= Identifier
referenced by: Extension-namespace-definition Namespace-name Namespace-alias: Identifier
         ::= Identifier
no referencesClass-name: Identifier Simple-template-id
         ::= Identifier
           | Simple-template-id
referenced by: Class-head-name Class-or-decltype Declarator-id Type-name Unqualified-id Enum-name: Identifier
         ::= Identifier
referenced by: Type-name Template-name: Identifier
         ::= Identifier
referenced by: Simple-template-id Translation-unit: Declaration-seq
         ::= Declaration-seq?
referenced by: StartSymbol Primary-expression: Literal this ( Expression ) Id-expression Lambda-expression
         ::= Literal
           | 'this'
           | '(' Expression ')'
           | Id-expression
           | Lambda-expression
referenced by: Postfix-expression Id-expression: Unqualified-id Qualified-id
         ::= Unqualified-id
           | Qualified-id
referenced by: Declarator-id Postfix-expression Primary-expression Template-argument Type-parameter Unqualified-id: Identifier Operator-function-id Conversion-function-id ~ Class-name Decltype-specifier Template-id
         ::= Identifier
           | Operator-function-id
           | Conversion-function-id
           | '~' ( Class-name | Decltype-specifier )
           | Template-id
referenced by: Id-expression Qualified-id Using-declaration Qualified-id: Nested-name-specifier template Unqualified-id :: Identifier Operator-function-id Literal-operator-id Template-id
         ::= Nested-name-specifier 'template'? Unqualified-id
           | '::' ( Identifier | Operator-function-id | Literal-operator-id | Template-id )
referenced by: Id-expression Nested-name-specifier: Type-name Namespace-name Decltype-specifier :: Identifier Simple-template-id template
         ::= ( Type-name | Namespace-name | Decltype-specifier )? '::' ( ( Identifier | 'template'? Simple-template-id ) '::' )*
referenced by: Class-head-name Class-or-decltype Declarator-id Elaborated-type-specifier Enum-head GNU-elaborated-template Pseudo-destructor-name Ptr-operator Qualified-id Qualified-namespace-specifier Simple-type-specifier Typename-specifier Using-declaration Using-directive Lambda-expression: Lambda-introducer Lambda-declarator Compound-statement referenced by: Primary-expression Lambda-introducer: [ Lambda-capture ]
         ::= '[' Lambda-capture? ']'
referenced by: Lambda-expression Lambda-capture: Capture-default , Capture-list Capture-list
         ::= Capture-default ( ',' Capture-list )?
           | Capture-list
referenced by: Lambda-introducer Capture-default: & =
         ::= '&'
           | '='
referenced by: Lambda-capture Capture-list: Capture ... ,
         ::= Capture '...'? ( ',' Capture '...'? )*
referenced by: Lambda-capture Capture: Simple-capture Init-capture
           | Init-capture
referenced by: Capture-list Simple-capture: & Identifier this
         ::= '&'? Identifier
           | 'this'
referenced by: Capture Init-capture: & Identifier Initializer
         ::= '&'? Identifier Initializer
referenced by: Capture Lambda-declarator: ( Parameter-declaration-clause ) mutable Exception-specification Attribute-specifier-seq Trailing-return-type referenced by: Lambda-expression Postfix-expression: Primary-expression Simple-type-specifier Typename-specifier ( Expression-list ) Braced-init-list dynamic_cast static_cast reinterpret_cast const_cast < Type-id > ( Expression typeid ( Expression Type-id ) [ Expression Braced-init-list ] ( Expression-list ) . -> template Id-expression Pseudo-destructor-name ++ --
         ::= ( Primary-expression | ( Simple-type-specifier | Typename-specifier ) ( '(' Expression-list? ')' | Braced-init-list ) | ( ( 'dynamic_cast' | 'static_cast' | 'reinterpret_cast' | 'const_cast' ) '<' Type-id '>' '(' Expression | 'typeid' '(' ( Expression | Type-id ) ) ')' ) ( '[' ( Expression | Braced-init-list ) ']' | '(' Expression-list? ')' | ( '.' | '->' ) ( 'template'? Id-expression | Pseudo-destructor-name ) | '++' | '--' )*
referenced by: Unary-expression Expression-list: Initializer-list
         ::= Initializer-list
referenced by: Initializer Mem-initializer New-initializer New-placement Postfix-expression Pseudo-destructor-name: :: Nested-name-specifier Type-name :: Nested-name-specifier template Simple-template-id :: ~ Type-name ~ Decltype-specifier
         ::= '::'? ( Nested-name-specifier? ( Type-name '::' )? | Nested-name-specifier 'template' Simple-template-id '::' ) '~' Type-name
           | '~' Decltype-specifier
referenced by: Postfix-expression Unary-expression: sizeof Postfix-expression ++ -- Unary-operator GNU-realimag-operator Cast-expression sizeof ( Type-id ... ( Identifier alignof ( Type-id ) New-expression Delete-expression GNU-builtin-function-call-expression GNU-extension Cast-expression Braced-init-list referenced by: Cast-expression Unary-operator: * & + - ! ~
         ::= '*'
           | '&'
           | '+'
           | '-'
           | '!'
           | '~'
referenced by: Unary-expression New-expression: :: new New-placement New-type-id ( Type-id ) New-initializer
         ::= '::'? 'new' New-placement? ( New-type-id | '(' Type-id ')' ) New-initializer?
referenced by: Unary-expression New-placement: ( Expression-list )
         ::= '(' Expression-list ')'
referenced by: New-expression New-type-id: Type-specifier-seq Ptr-operator Ptr-operator Noptr-new-declarator referenced by: New-expression Noptr-new-declarator: [ Expression ] Attribute-specifier-seq Constant-expression [ referenced by: New-type-id New-initializer: ( Expression-list ) Braced-init-list
         ::= '(' Expression-list? ')'
           | Braced-init-list
referenced by: New-expression Delete-expression: :: delete [ ] Cast-expression
         ::= '::'? 'delete' ( '[' ']' )? Cast-expression
referenced by: Unary-expression Noexcept-expression: noexcept ( Expression )
         ::= 'noexcept' '(' Expression ')'
no referencesCast-expression: ( Type-id ) GNU-extension ( Expression ) Unary-expression ( struct Identifier Type-id [ ] ) GNU-statement-expression
         ::= ( '(' Type-id ')' | GNU-extension ( '(' Expression ')' )? )?* ( Unary-expression | '(' ( 'struct' Identifier | Type-id '[' ']' ) ')' | GNU-statement-expression )
referenced by: Delete-expression GNU-statement-expression Pm-expression Unary-expression GNU-statement-expression: GNU-extension ( Compound-statement ) Cast-expression
         ::= GNU-extension? '(' Compound-statement ')' Cast-expression
referenced by: Cast-expression Pm-expression: Cast-expression .* ->*
         ::= Cast-expression ( ( '.*' | '->*' ) Cast-expression )*
referenced by: Multiplicative-expression Multiplicative-expression: Pm-expression * / %
         ::= Pm-expression ( ( '*' | '/' | '%' ) Pm-expression )*
referenced by: Additive-expression Additive-expression: Multiplicative-expression + -
         ::= Multiplicative-expression ( ( '+' | '-' ) Multiplicative-expression )*
referenced by: Shift-expression Shift-expression: Additive-expression << >>
         ::= Additive-expression ( ( '<<' | '>>' ) Additive-expression )*
referenced by: Relational-expression Relational-expression: Shift-expression < > <= >=
         ::= Shift-expression ( ( '<' | '>' | '<=' | '>=' ) Shift-expression )*
referenced by: Equality-expression Equality-expression: Relational-expression == !=
         ::= Relational-expression ( ( '==' | '!=' ) Relational-expression )*
referenced by: And-expression And-expression: Equality-expression &
         ::= Equality-expression ( '&' Equality-expression )*
referenced by: Exclusive-or-expression Exclusive-or-expression: And-expression ^
         ::= And-expression ( '^' And-expression )*
referenced by: Inclusive-or-expression Inclusive-or-expression: Exclusive-or-expression |
         ::= Exclusive-or-expression ( '|' Exclusive-or-expression )*
referenced by: Logical-and-expression Logical-and-expression: Inclusive-or-expression &&
         ::= Inclusive-or-expression ( '&&' Inclusive-or-expression )*
referenced by: Logical-or-expression Logical-or-expression: Logical-and-expression ||
         ::= Logical-and-expression ( '||' Logical-and-expression )*
referenced by: Assignment-expression Conditional-expression Conditional-expression: Logical-or-expression ? Expression : Assignment-expression
         ::= Logical-or-expression ( '?' Expression ':' Assignment-expression )?
referenced by: Assignment-expression Constant-expression Assignment-expression: Conditional-expression Logical-or-expression Assignment-operator Initializer-clause Throw-expression
         ::= Conditional-expression
           | Throw-expression
referenced by: Alignment-specifier Conditional-expression Expression Initializer-clause Parameter-declaration Throw-expression Assignment-operator: = *= /= %= += -= >>= <<= &= ^= |=
         ::= '='
           | '*='
           | '/='
           | '%='
           | '+='
           | '-='
           | '>>='
           | '<<='
           | '&='
           | '^='
           | '|='
referenced by: Assignment-expression Expression: Assignment-expression Compound-statement , Assignment-expression referenced by: Cast-expression Condition Conditional-expression Decltype-specifier Expression-statement For-range-initializer GNU-asm-def GNU-attribute-exp GNU-builtin-arg GNU-extension GNU-ternary-decl-op GNU-typeof-extension Iteration-statement Jump-statement Noexcept-expression Noptr-declarator Noptr-new-declarator Postfix-expression Primary-expression Constant-expression: Conditional-expression
         ::= Conditional-expression
referenced by: Enumerator-definition Labeled-statement Member-declarator Noexcept-specification Noptr-abstract-declarator Noptr-abstract-pack-declarator Noptr-new-declarator Static-assert-declaration Template-argument Statement: Labeled-statement Attribute-specifier-seq Expression-statement Compound-statement Selection-statement Iteration-statement Jump-statement Try-block Declaration-statement
         ::= Labeled-statement
           | Declaration-statement
referenced by: Iteration-statement Labeled-statement Selection-statement Statement-seq Labeled-statement: Attribute-specifier-seq Identifier default case Constant-expression ... Constant-expression : Statement
         ::= Attribute-specifier-seq? ( Identifier | 'default' | 'case' Constant-expression ( '...' Constant-expression )? ) ':' Statement
referenced by: Statement Expression-statement: Expression ;
         ::= Expression? ';'
referenced by: For-init-statement Statement Compound-statement: { Statement-seq }
         ::= '{' Statement-seq? '}'
referenced by: Expression Function-body Function-try-block GNU-extension GNU-statement-expression Handler Lambda-expression Statement Try-block Statement-seq: Statement
         ::= Statement+
referenced by: Compound-statement Selection-statement: if ( Condition ) Statement else switch ( Condition ) Statement
         ::= ( 'if' '(' Condition ')' ( Statement 'else' )? | 'switch' '(' Condition ')' ) Statement
referenced by: Statement Condition: Expression Attribute-specifier-seq Decl-specifier-seq Declarator = Initializer-clause Braced-init-list
         ::= Expression
referenced by: Iteration-statement Selection-statement Iteration-statement: while ( Condition for ( For-init-statement Condition ; Expression For-range-declaration : For-range-initializer ) Statement do Statement while ( Expression ) ;
         ::= ( 'while' '(' Condition | 'for' '(' ( For-init-statement Condition? ';' Expression? | For-range-declaration ':' For-range-initializer ) ) ')' Statement
           | 'do' Statement 'while' '(' Expression ')' ';'
referenced by: Statement For-init-statement: Expression-statement Simple-declaration
         ::= Expression-statement
           | Simple-declaration
referenced by: Iteration-statement For-range-declaration: Attribute-specifier-seq Decl-specifier-seq Declarator referenced by: Iteration-statement For-range-initializer: Expression Braced-init-list
         ::= Expression
           | Braced-init-list
referenced by: Iteration-statement Jump-statement: break continue goto Identifier return Expression Braced-init-list ;
         ::= ( 'break' | 'continue' | 'goto' Identifier | 'return' ( Expression | Braced-init-list )? ) ';'
referenced by: Statement Declaration-statement: Block-declaration
         ::= Block-declaration
referenced by: Statement Declaration-seq: Pragma-line Declaration
         ::= Pragma-line? Declaration+
referenced by: Linkage-specification Namespace-body Translation-unit Declaration: Block-declaration Function-definition Template-declaration Explicit-instantiation Explicit-specialization Linkage-specification Namespace-definition ; Attribute-declaration
         ::= Block-declaration
           | Function-definition
           | Template-declaration
           | Explicit-instantiation
           | Explicit-specialization
           | Linkage-specification
           | Namespace-definition
           | ';'
           | Attribute-declaration
referenced by: Declaration-seq Explicit-instantiation Explicit-specialization Linkage-specification Template-declaration Block-declaration: Simple-declaration Asm-definition Namespace-alias-definition Using-declaration Using-directive Static-assert-declaration Alias-declaration Opaque-enum-declaration Pragma-line
         ::= Simple-declaration
           | Asm-definition
           | Namespace-alias-definition
           | Using-declaration
           | Using-directive
           | Static-assert-declaration
           | Alias-declaration
           | Opaque-enum-declaration
           | Pragma-line
referenced by: Declaration Declaration-statement Alias-declaration: using Identifier Attribute-specifier-seq = Type-id ;
         ::= 'using' Identifier Attribute-specifier-seq? '=' Type-id ';'
referenced by: Block-declaration Member-declaration Simple-declaration: Decl-specifier-seq Init-declarator-list Attribute-specifier-seq Decl-specifier-seq Init-declarator-list GNU-ternary-decl-op ; referenced by: Block-declaration For-init-statement GNU-ternary-decl-op: Type-specifier Expression ? Expression : Expression
         ::= Type-specifier Expression '?' Expression? ':' Expression
referenced by: Simple-declaration Static-assert-declaration: static_assert ( Constant-expression , String-literal ) ;
         ::= 'static_assert' '(' Constant-expression ',' String-literal ')' ';'
referenced by: Block-declaration Member-declaration Attribute-declaration: Attribute-specifier-seq ;
         ::= Attribute-specifier-seq ';'
referenced by: Declaration Decl-specifier: Storage-class-specifier Type-specifier Function-specifier friend typedef GNU-typeof-extension constexpr
         ::= Storage-class-specifier
           | Type-specifier
           | Function-specifier
           | 'friend'
           | 'typedef' GNU-typeof-extension?
           | 'constexpr'
referenced by: Decl-specifier-seq Decl-specifier-seq: Decl-specifier Attribute-specifier-seq GNU-attribute Decl-specifier GNU-attribute
           | GNU-attribute? ( Decl-specifier GNU-attribute? )+
referenced by: Condition For-range-declaration Function-definition Member-declaration Parameter-declaration Simple-declaration Storage-class-specifier: register static GNU-typeof-extension thread_local extern mutable
         ::= 'register'
           | 'static' GNU-typeof-extension?
           | 'thread_local'
           | 'extern'
           | 'mutable'
referenced by: Decl-specifier Function-specifier: inline virtual explicit
         ::= 'inline'
           | 'virtual'
           | 'explicit'
referenced by: Decl-specifier Type-specifier: Trailing-type-specifier Class-specifier Enum-specifier
         ::= Trailing-type-specifier
           | Class-specifier
           | Enum-specifier
referenced by: Decl-specifier GNU-ternary-decl-op Type-specifier-seq Trailing-type-specifier: Simple-type-specifier GNU-attribute Elaborated-type-specifier Typename-specifier Cv-qualifier
         ::= Simple-type-specifier GNU-attribute?
           | Elaborated-type-specifier
           | Typename-specifier
           | Cv-qualifier
referenced by: Trailing-type-specifier-seq Type-specifier Type-specifier-seq: Type-specifier Attribute-specifier-seq
         ::= Type-specifier+ Attribute-specifier-seq?
referenced by: Conversion-type-id Enum-base Exception-declaration New-type-id Type-id Trailing-type-specifier-seq: Trailing-type-specifier Attribute-specifier-seq referenced by: Trailing-return-type Simple-type-specifier: Nested-name-specifier Type-name Nested-name-specifier template Simple-template-id char char16_t char32_t wchar_t bool short int long signed unsigned float double void auto Decltype-specifier
         ::= Nested-name-specifier? Type-name
           | Nested-name-specifier 'template' Simple-template-id
           | 'char'
           | 'char16_t'
           | 'char32_t'
           | 'wchar_t'
           | 'bool'
           | 'short'
           | 'int'
           | 'long'
           | 'signed'
           | 'unsigned'
           | 'float'
           | 'double'
           | 'void'
           | 'auto'
           | Decltype-specifier
referenced by: Postfix-expression Trailing-type-specifier Type-name: Class-name Enum-name Typedef-name Simple-template-id
         ::= Class-name
           | Enum-name
           | Typedef-name
           | Simple-template-id
referenced by: Nested-name-specifier Pseudo-destructor-name Simple-type-specifier Decltype-specifier: decltype ( Expression auto )
         ::= 'decltype' '(' ( Expression | 'auto' ) ')'
referenced by: Class-or-decltype Nested-name-specifier Pseudo-destructor-name Simple-type-specifier Unqualified-id Elaborated-type-specifier: Class-key Attribute-specifier-seq Nested-name-specifier Identifier Nested-name-specifier template Simple-template-id enum Nested-name-specifier Identifier
           | 'enum' Nested-name-specifier? Identifier
referenced by: Trailing-type-specifier Enum-specifier: Enum-head { Enumerator-list , }
         ::= Enum-head '{' ( Enumerator-list ','? )? '}'
referenced by: Type-specifier Enum-head: Enum-key Attribute-specifier-seq Identifier Enum-base Nested-name-specifier Identifier Enum-base referenced by: Enum-specifier Opaque-enum-declaration: Enum-key Attribute-specifier-seq Identifier Enum-base ; referenced by: Block-declaration Enum-key: enum class struct
Enum-key ::= 'enum' ( 'class' | 'struct' )?
referenced by: Enum-head Opaque-enum-declaration Enum-base: : Type-specifier-seq
         ::= ':' Type-specifier-seq
referenced by: Enum-head Opaque-enum-declaration Enumerator-list: Enumerator-definition ,
         ::= Enumerator-definition ( ',' Enumerator-definition )*
referenced by: Enum-specifier Enumerator-definition: Enumerator = Constant-expression
         ::= Enumerator ( '=' Constant-expression )?
referenced by: Enumerator-list Enumerator: Identifier
         ::= Identifier
referenced by: Enumerator-definition Namespace-definition: Named-namespace-definition Unnamed-namespace-definition
         ::= Named-namespace-definition
           | Unnamed-namespace-definition
referenced by: Declaration Named-namespace-definition: Original-namespace-definition Extension-namespace-definition
         ::= Original-namespace-definition
           | Extension-namespace-definition
referenced by: Namespace-definition Original-namespace-definition: inline namespace Identifier GNU-attribute { Namespace-body }
         ::= 'inline'? 'namespace' Identifier GNU-attribute? '{' Namespace-body '}'
referenced by: Named-namespace-definition Extension-namespace-definition: inline namespace Original-namespace-name { Namespace-body }
         ::= 'inline'? 'namespace' Original-namespace-name '{' Namespace-body '}'
referenced by: Named-namespace-definition Unnamed-namespace-definition: inline namespace { Namespace-body }
         ::= 'inline'? 'namespace' '{' Namespace-body '}'
referenced by: Namespace-definition Namespace-body: Declaration-seq
         ::= Declaration-seq?
referenced by: Extension-namespace-definition Original-namespace-definition Unnamed-namespace-definition Namespace-alias-definition: namespace Identifier = Qualified-namespace-specifier ;
         ::= 'namespace' Identifier '=' Qualified-namespace-specifier ';'
referenced by: Block-declaration Qualified-namespace-specifier: Nested-name-specifier Namespace-name
         ::= Nested-name-specifier? Namespace-name
referenced by: Namespace-alias-definition Using-declaration: using typename Nested-name-specifier :: Unqualified-id ;
         ::= 'using' ( 'typename'? Nested-name-specifier | '::' ) Unqualified-id ';'
referenced by: Block-declaration Member-declaration Using-directive: Attribute-specifier-seq using namespace Nested-name-specifier Namespace-name ;
         ::= Attribute-specifier-seq? 'using' 'namespace' Nested-name-specifier? Namespace-name ';'
referenced by: Block-declaration Asm-definition: GNU-asm-definition ;
         ::= GNU-asm-definition ';'
referenced by: Block-declaration GNU-asm-definition: asm __asm__ volatile __volatile__ ( GNU-asm-extension )
         ::= ( 'asm' | '__asm__' ) ( 'volatile' | '__volatile__' )? '(' GNU-asm-extension ')'
referenced by: Asm-definition Init-declarator Linkage-specification: extern String-literal GNU-typeof-extension { Declaration-seq } Declaration
         ::= 'extern' String-literal GNU-typeof-extension? ( '{' Declaration-seq? '}' | Declaration )
referenced by: Declaration Attribute-specifier-seq: Attribute-specifier
         ::= Attribute-specifier+
referenced by: Alias-declaration Attribute-declaration Base-specifier Class-head Condition Decl-specifier-seq Elaborated-type-specifier Enum-head Exception-declaration For-range-declaration Function-definition Labeled-statement Lambda-declarator Member-declaration Member-declarator Noptr-abstract-declarator Noptr-abstract-pack-declarator Noptr-declarator Noptr-new-declarator Opaque-enum-declaration Parameters-and-qualifiers Ptr-operator Simple-declaration Statement Trailing-type-specifier-seq Type-specifier-seq Using-directive Attribute-specifier: [ [ Attribute-list ] ] Alignment-specifier
         ::= '[' '[' Attribute-list ']' ']'
           | Alignment-specifier
referenced by: Attribute-specifier-seq Alignment-specifier: alignas ( Type-id ... Assignment-expression )
         ::= 'alignas' '(' ( Type-id '...'? | Assignment-expression ) ')'
referenced by: Attribute-specifier Attribute-list: Attribute ... ,
         ::= ( Attribute '...'? )? ( ',' ( Attribute '...'? )? )*
referenced by: Attribute-specifier Attribute: Attribute-token Attribute-argument-clause referenced by: Attribute-list Attribute-token: Identifier Attribute-scoped-token
         ::= Identifier
           | Attribute-scoped-token
referenced by: Attribute Attribute-scoped-token: Attribute-namespace :: Identifier
         ::= Attribute-namespace '::' Identifier
referenced by: Attribute-token Attribute-namespace: Identifier
         ::= Identifier
referenced by: Attribute-scoped-token Attribute-argument-clause: ( Balanced-token-seq )
         ::= '(' Balanced-token-seq ')'
referenced by: Attribute Balanced-token-seq: Balanced-token Balanced-token
         ::= Balanced-token? Balanced-token*
referenced by: Attribute-argument-clause Balanced-token Balanced-token: ( Balanced-token-seq ) [ Balanced-token-seq ] { Balanced-token-seq }
         ::= '(' Balanced-token-seq ')'
           | '[' Balanced-token-seq ']'
           | '{' Balanced-token-seq '}'
referenced by: Balanced-token-seq Init-declarator-list: Init-declarator ,
         ::= Init-declarator ( ',' Init-declarator )*
referenced by: Simple-declaration Init-declarator: Declarator GNU-attribute-list GNU-asm-definition Initializer referenced by: Init-declarator-list Declarator: Ptr-declarator Noptr-declarator Parameters-and-qualifiers Trailing-return-type
         ::= Ptr-declarator
referenced by: Condition Exception-declaration For-range-declaration Function-definition Init-declarator Member-declarator Parameter-declaration Ptr-declarator: Ptr-operator GNU-restrict Noptr-declarator
         ::= ( Ptr-operator GNU-restrict? )* Noptr-declarator
referenced by: Declarator Noptr-declarator Noptr-declarator: GNU-attribute Declarator-id Attribute-specifier-seq ( Ptr-declarator ) Parameters-and-qualifiers [ Expression ] Attribute-specifier-seq referenced by: Declarator Ptr-declarator Parameters-and-qualifiers: ( Parameter-declaration-clause ) Cv-qualifier-seq Ref-qualifier Exception-specification Attribute-specifier-seq
         ::= '(' Parameter-declaration-clause ')' Cv-qualifier-seq?
referenced by: Abstract-declarator Declarator Noptr-abstract-declarator Noptr-abstract-pack-declarator Noptr-declarator Trailing-return-type: -> Trailing-type-specifier-seq Abstract-declarator referenced by: Abstract-declarator Declarator Lambda-declarator Ptr-operator: Nested-name-specifier * Attribute-specifier-seq Cv-qualifier-seq & && Attribute-specifier-seq
           | ( '&' | '&&' ) Attribute-specifier-seq?
referenced by: Abstract-declarator Conversion-type-id New-type-id Ptr-abstract-declarator Ptr-declarator Cv-qualifier-seq: Cv-qualifier
         ::= Cv-qualifier+
referenced by: Parameters-and-qualifiers Ptr-operator Cv-qualifier: const __const volatile
         ::= 'const'
           | '__const'
           | 'volatile'
referenced by: Cv-qualifier-seq Trailing-type-specifier Ref-qualifier: & &&
         ::= '&'
           | '&&'
referenced by: Parameters-and-qualifiers Declarator-id: ... Id-expression Nested-name-specifier Class-name
         ::= '...'? Id-expression
           | Nested-name-specifier? Class-name
referenced by: Noptr-declarator Type-id: Type-specifier-seq Abstract-declarator referenced by: Alias-declaration Alignment-specifier Cast-expression GNU-extension New-expression Postfix-expression Template-argument Type-id-list Type-parameter Unary-expression Abstract-declarator: Ptr-operator Noptr-abstract-pack-declarator Ptr-operator Ptr-abstract-declarator Noptr-abstract-declarator Parameters-and-qualifiers Trailing-return-type
         ::= Ptr-abstract-declarator
referenced by: Exception-declaration Parameter-declaration Trailing-return-type Type-id Ptr-abstract-declarator: Ptr-operator Noptr-abstract-declarator Ptr-operator referenced by: Abstract-declarator Noptr-abstract-declarator Noptr-abstract-declarator: Parameters-and-qualifiers [ Constant-expression ] Attribute-specifier-seq ( Ptr-abstract-declarator ) Parameters-and-qualifiers [ Constant-expression ] Attribute-specifier-seq referenced by: Abstract-declarator Ptr-abstract-declarator Noptr-abstract-pack-declarator: ... Parameters-and-qualifiers [ Constant-expression ] Attribute-specifier-seq
         ::= '...' ( Parameters-and-qualifiers | '[' Constant-expression? ']' Attribute-specifier-seq? )*
referenced by: Abstract-declarator Parameter-declaration-clause: Parameter-declaration-list ... Parameter-declaration-list , ...
         ::= Parameter-declaration-list? '...'?
           | Parameter-declaration-list ',' '...'
referenced by: Lambda-declarator Parameters-and-qualifiers Parameter-declaration-list: Parameter-declaration GNU-attribute , Parameter-declaration referenced by: Parameter-declaration-clause Parameter-declaration: Decl-specifier-seq Abstract-declarator = Assignment-expression Declarator GNU-attribute = Assignment-expression referenced by: GNU-builtin-arg Parameter-declaration-list Template-parameter Function-definition: Attribute-specifier-seq Decl-specifier-seq Declarator Virt-specifier-seq Function-body referenced by: Declaration Member-declaration Function-body: Ctor-initializer Compound-statement Function-try-block = default delete ;
         ::= Ctor-initializer? Compound-statement
           | Function-try-block
           | '=' ( 'default' | 'delete' ) ';'
referenced by: Function-definition Initializer: Brace-or-equal-initializer ( Expression-list )
         ::= Brace-or-equal-initializer
           | '(' Expression-list ')'
referenced by: Init-capture Init-declarator Brace-or-equal-initializer: = Initializer-clause Braced-init-list
         ::= '=' Initializer-clause
           | Braced-init-list
referenced by: Initializer Member-declarator Initializer-clause: Assignment-expression Braced-init-list
         ::= Assignment-expression
           | Braced-init-list
referenced by: Assignment-expression Brace-or-equal-initializer Condition Initializer-list Initializer-list: Initializer-clause ... ,
         ::= Initializer-clause '...'? ( ',' Initializer-clause '...'? )*
referenced by: Braced-init-list Expression-list Braced-init-list: { Initializer-list , }
         ::= '{' ( Initializer-list ','? )? '}'
referenced by: Brace-or-equal-initializer Condition For-range-initializer Initializer-clause Jump-statement Mem-initializer New-initializer Postfix-expression Unary-expression Class-specifier: Class-head { Member-specification }
         ::= Class-head '{' Member-specification? '}'
referenced by: Type-specifier Class-head: Class-key Attribute-specifier-seq Class-head-name final Base-clause
         ::= Class-key Attribute-specifier-seq? ( Class-head-name 'final'? )? Base-clause?
referenced by: Class-specifier Class-head-name: Nested-name-specifier Class-name
         ::= Nested-name-specifier? Class-name
referenced by: Class-head Class-key: class struct union
         ::= 'class'
           | 'struct'
           | 'union'
referenced by: Class-head Elaborated-type-specifier Member-specification: Member-declaration Access-specifier :
         ::= ( Member-declaration | Access-specifier ':' )+
referenced by: Access-specifier Class-specifier Access-specifier: Member-specification private protected public
         ::= ( Member-specification | 'private' | 'protected' | 'public' )?
referenced by: Base-specifier Member-specification Member-declaration: Attribute-specifier-seq Decl-specifier-seq Member-declarator-list ; Function-definition ; Using-declaration Static-assert-declaration Template-declaration Alias-declaration
           | Function-definition ';'?
           | Using-declaration
           | Static-assert-declaration
           | Template-declaration
           | Alias-declaration
referenced by: Member-specification Member-declarator-list: Member-declarator ,
         ::= Member-declarator ( ',' Member-declarator )*
referenced by: Member-declaration Member-declarator: Declarator Virt-specifier-seq Pure-specifier Brace-or-equal-initializer Identifier Attribute-specifier-seq : Constant-expression referenced by: Member-declarator-list Virt-specifier-seq: Virt-specifier
         ::= Virt-specifier+
referenced by: Function-definition Member-declarator Virt-specifier: override final
         ::= 'override'
           | 'final'
referenced by: Virt-specifier-seq Pure-specifier: = 0
         ::= '=' '0'
referenced by: Member-declarator Base-clause: : Base-specifier-list
         ::= ':' Base-specifier-list
referenced by: Class-head Base-specifier-list: Base-specifier ... ,
         ::= Base-specifier '...'? ( ',' Base-specifier '...'? )*
referenced by: Base-clause Base-specifier: Attribute-specifier-seq virtual Access-specifier Access-specifier virtual Base-type-specifier
         ::= Attribute-specifier-seq? ( 'virtual' Access-specifier? | Access-specifier 'virtual'? )? Base-type-specifier
referenced by: Base-specifier-list Class-or-decltype: Nested-name-specifier Class-name Decltype-specifier
         ::= Nested-name-specifier? Class-name
           | Decltype-specifier
referenced by: Base-type-specifier Mem-initializer-id Base-type-specifier: Class-or-decltype
         ::= Class-or-decltype
referenced by: Base-specifier Conversion-function-id: operator Conversion-type-id
         ::= 'operator' Conversion-type-id
referenced by: Unqualified-id Conversion-type-id: Type-specifier-seq Ptr-operator
         ::= Type-specifier-seq Ptr-operator*
referenced by: Conversion-function-id Ctor-initializer: : Mem-initializer-list
         ::= ':' Mem-initializer-list
referenced by: Function-body Function-try-block Mem-initializer-list: Mem-initializer , Mem-initializer-list ...
         ::= Mem-initializer ( ',' Mem-initializer-list )? '...'?
referenced by: Ctor-initializer Mem-initializer-list Mem-initializer: Mem-initializer-id ( Expression-list ) Braced-init-list
         ::= Mem-initializer-id ( '(' Expression-list? ')' | Braced-init-list )
referenced by: Mem-initializer-list Mem-initializer-id: Class-or-decltype Identifier
         ::= Class-or-decltype
           | Identifier
referenced by: Mem-initializer Operator-function-id: operator Operator
         ::= 'operator' Operator
referenced by: Qualified-id Template-id Unqualified-id Operator: new delete [ ] + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> () []
Operator ::= ( 'new' | 'delete' ) ( '[' ']' )?
           | '+'
           | '-'
           | '*'
           | '/'
           | '%'
           | '^'
           | '&'
           | '|'
           | '~'
           | '!'
           | '='
           | '<'
           | '>'
           | '+='
           | '-='
           | '*='
           | '/='
           | '%='
           | '^='
           | '&='
           | '|='
           | '<<'
           | '>>'
           | '>>='
           | '<<='
           | '=='
           | '!='
           | '<='
           | '>='
           | '&&'
           | '||'
           | '++'
           | '--'
           | ','
           | '->*'
           | '->'
           | '()'
           | '[]'
referenced by: Operator-function-id Literal-operator-id: operator String-literal Identifier
         ::= 'operator' String-literal Identifier
referenced by: Qualified-id Template-id Template-declaration: template < Template-parameter-list > Declaration
         ::= 'template' '<' Template-parameter-list '>' Declaration
referenced by: Declaration Member-declaration Template-parameter-list: Template-parameter ,
         ::= Template-parameter ( ',' Template-parameter )*
referenced by: Template-declaration Type-parameter Template-parameter: Type-parameter Parameter-declaration
         ::= Type-parameter
           | Parameter-declaration
referenced by: Template-parameter-list Type-parameter: class typename ... Identifier Identifier = Type-id template < Template-parameter-list > class ... Identifier Identifier = Id-expression
         ::= ( 'class' | 'typename' ) ( '...'? Identifier? | Identifier? '=' Type-id )
           | 'template' '<' Template-parameter-list '>' 'class' ( '...'? Identifier? | Identifier? '=' Id-expression )
referenced by: Template-parameter Simple-template-id: GNU-elaborated-template Template-name < Template-argument-list > referenced by: Class-name Elaborated-type-specifier Nested-name-specifier Pseudo-destructor-name Simple-type-specifier Template-id Type-name Typename-specifier Template-id: Simple-template-id Operator-function-id Literal-operator-id < Template-argument-list >
         ::= Simple-template-id
           | ( Operator-function-id | Literal-operator-id ) '<' Template-argument-list? '>'
referenced by: Qualified-id Unqualified-id Template-argument-list: Template-argument ... ,
         ::= Template-argument '...'? ( ',' Template-argument '...'? )*
referenced by: Simple-template-id Template-id Template-argument: Constant-expression Type-id Id-expression
         ::= Constant-expression
           | Type-id
           | Id-expression
referenced by: Template-argument-list Typename-specifier: typename Nested-name-specifier Identifier template Simple-template-id
         ::= 'typename' Nested-name-specifier ( Identifier | 'template'? Simple-template-id )
referenced by: Postfix-expression Trailing-type-specifier Explicit-instantiation: extern template Declaration
         ::= 'extern'? 'template' Declaration
referenced by: Declaration Explicit-specialization: template < > Declaration
         ::= 'template' '<' '>' Declaration
referenced by: Declaration Try-block: try Compound-statement Handler-seq
         ::= 'try' Compound-statement Handler-seq
referenced by: Statement Function-try-block: try Ctor-initializer Compound-statement Handler-seq
         ::= 'try' Ctor-initializer? Compound-statement Handler-seq
referenced by: Function-body Handler-seq: Handler
         ::= Handler+
referenced by: Function-try-block Try-block Handler: catch ( Exception-declaration ) Compound-statement referenced by: Handler-seq Exception-declaration: Attribute-specifier-seq Type-specifier-seq Declarator Abstract-declarator ...
           | '...'
referenced by: Handler Throw-expression: throw GNU-attribute Assignment-expression
         ::= 'throw' GNU-attribute? Assignment-expression?
referenced by: Assignment-expression Exception-specification: Dynamic-exception-specification Noexcept-specification
         ::= Dynamic-exception-specification
           | Noexcept-specification
referenced by: Lambda-declarator Parameters-and-qualifiers Dynamic-exception-specification: throw ( Type-id-list ) GNU-attribute
         ::= 'throw' '(' Type-id-list? ')' GNU-attribute?
referenced by: Exception-specification Type-id-list: Type-id ... ,
         ::= Type-id '...'? ( ',' Type-id '...'? )*
referenced by: Dynamic-exception-specification Noexcept-specification: noexcept ( Constant-expression )
         ::= 'noexcept' ( '(' Constant-expression ')' )?
referenced by: Exception-specification GNU-restrict: __restrict__ __restrict
         ::= '__restrict__'
           | '__restrict'
referenced by: Ptr-declarator GNU-attribute-list: GNU-attribute
         ::= GNU-attribute+
referenced by: Init-declarator GNU-attribute: __attribute__ ( ( GNU-attribute-exp-list __unused__ ) )
         ::= '__attribute__' '(' '(' ( GNU-attribute-exp-list | '__unused__' )? ')' ')'
referenced by: Decl-specifier-seq Dynamic-exception-specification GNU-attribute-list Noptr-declarator Original-namespace-definition Parameter-declaration Parameter-declaration-list Throw-expression Trailing-type-specifier GNU-attribute-exp-list: GNU-attribute-exp ,
         ::= GNU-attribute-exp ( ',' GNU-attribute-exp )*
referenced by: GNU-attribute GNU-attribute-exp GNU-attribute-exp: Expression Single-string-literal __visibility__ ( GNU-attribute-exp-list ) ( GNU-attribute-exp-list )
         ::= ( Expression | Single-string-literal | '__visibility__' '(' GNU-attribute-exp-list ')' ) ( '(' GNU-attribute-exp-list ')' )*
referenced by: GNU-attribute-exp-list GNU-typeof-extension: __typeof__ __typeof ( Expression )
         ::= ( '__typeof__' | '__typeof' ) '(' Expression ')'
referenced by: Decl-specifier Linkage-specification Storage-class-specifier GNU-extension: __extension__ ( Type-id Expression ) ( __extension__ ( Compound-statement ) ) ;
         ::= '__extension__' '(' ( Type-id | Expression ) ')'
           | '(' '__extension__' '(' Compound-statement ')' ')' ';'
referenced by: Cast-expression GNU-statement-expression Unary-expression GNU-builtin-function-call-expression: __builtin_va_start __builtin_va_arg ( GNU-builtin-arg-list )
         ::= ( '__builtin_va_start' | '__builtin_va_arg' ) '(' GNU-builtin-arg-list? ')'
referenced by: Unary-expression GNU-builtin-arg-list: GNU-builtin-arg ,
         ::= GNU-builtin-arg ( ',' GNU-builtin-arg )*
referenced by: GNU-builtin-function-call-expression GNU-builtin-arg: Parameter-declaration Expression
         ::= Parameter-declaration
           | Expression
referenced by: GNU-builtin-arg-list GNU-realimag-operator: __real__ __imag__
         ::= '__real__'
           | '__imag__'
referenced by: Unary-expression GNU-asm-extension: String-literal GNU-asm-def :: : ,
         ::= ( ( String-literal | GNU-asm-def | '::' | ':' ) ','? )+
referenced by: GNU-asm-definition GNU-asm-def: ( Expression ) [ Identifier ]
         ::= '(' Expression ')'
           | '[' Identifier ']'
referenced by: GNU-asm-extension GNU-elaborated-template: Nested-name-specifier template
         ::= Nested-name-specifier 'template'
referenced by: Simple-template-id Pragma-line: #pragma [^\n]
         ::= '#pragma' [^\n]+
referenced by: Block-declaration Declaration-seq   ... generated by RR - Railroad Diagram Generator R R