File: nested-name-specifier.cpp

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (28 lines) | stat: -rw-r--r-- 1,381 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// RUN: clang-pseudo -grammar=cxx -source=%s --print-forest | FileCheck %s

// Verify that we don't form a complete `::` nested-name-specifier if there is
// an identifier preceding it.
Foo::Foo() {} // No  "Foo ::Foo()" false parse
// CHECK:      ├─declaration-seq~function-definition := function-declarator function-body
// CHECK-NEXT: │ ├─function-declarator~noptr-declarator := noptr-declarator parameters-and-qualifiers

int ::x;
// CHECK:      declaration~simple-declaration := decl-specifier-seq init-declarator-list ;
// CHECK-NEXT: ├─decl-specifier-seq~INT

void test() {
  X::Y::Z; // No false qualified-declarator parses "X ::Y::Z" and "X::Y ::Z".
// CHECK:  statement-seq~statement := <ambiguous>
// CHECK:  statement~expression-statement := expression ;
// CHECK:  statement~simple-declaration := decl-specifier-seq ;
// CHECK-NOT: simple-declaration := decl-specifier-seq init-declarator-list ;

  // FIXME: eliminate the false `a<b> ::c` declaration parse.
  a<b>::c;
// CHECK: statement := <ambiguous>
// CHECK-NEXT: ├─statement~expression-statement := expression ;
// CHECK-NEXT: │ ├─expression~relational-expression :=
// CHECK:      └─statement~simple-declaration := <ambiguous>
// CHECK-NEXT:   ├─simple-declaration := decl-specifier-seq ;
// CHECK:        └─simple-declaration := decl-specifier-seq init-declarator-list ;
}