annotate-nested-name-specifier.cpp revision c22b5fff39a7520207f165fb16a27a34b944bd9c
1dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregornamespace outer {
2dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  namespace inner {
3dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    template<typename T>
4dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    struct vector {
5dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      typedef T* iterator;
6dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    };
7dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  }
8dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor}
9dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
10dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregornamespace outer_alias = outer;
11dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
12dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregorstruct X { };
13dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
14dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregorusing outer_alias::inner::vector;
15dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
16dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregorstruct X_vector : outer_alias::inner::vector<X> {
17dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  using outer_alias::inner::vector<X>::iterator;
18dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor};
19dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
20c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregornamespace outer {
21c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  namespace inner {
22c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    template<typename T, unsigned N>
23c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    struct array {
24c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      void foo();
25c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      static int max_size;
26c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    };
27c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  }
28c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor}
29c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
30c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename T, unsigned N>
31c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregorvoid outer::inner::array<T, N>::foo() {
32c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor}
33dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
34c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename T, unsigned N>
35c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregorint outer::inner::array<T, N>::max_size = 17;
36dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
37c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor// RUN: c-index-test -test-annotate-tokens=%s:13:1:36:1 %s | FileCheck %s
38dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
39dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Keyword: "using" [14:1 - 14:6] UsingDeclaration=vector[4:12]
40dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Identifier: "outer_alias" [14:7 - 14:18] NamespaceRef=outer_alias:10:11
41dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Punctuation: "::" [14:18 - 14:20] UsingDeclaration=vector[4:12]
42dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Identifier: "inner" [14:20 - 14:25] NamespaceRef=inner:2:13
43dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Punctuation: "::" [14:25 - 14:27] UsingDeclaration=vector[4:12]
44dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Identifier: "vector" [14:27 - 14:33] OverloadedDeclRef=vector[4:12]
45dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Punctuation: ";" [14:33 - 14:34]
46dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// FIXME: Base specifiers, too
47dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Keyword: "using" [17:3 - 17:8] UsingDeclaration=iterator[5:18]
48dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Identifier: "outer_alias" [17:9 - 17:20] NamespaceRef=outer_alias:10:11
49dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Punctuation: "::" [17:20 - 17:22] UsingDeclaration=iterator[5:18]
50dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Identifier: "inner" [17:22 - 17:27] NamespaceRef=inner:2:13
51dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Punctuation: "::" [17:27 - 17:29] UsingDeclaration=iterator[5:18]
52dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Identifier: "vector" [17:29 - 17:35] TemplateRef=vector:4:12
53dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Punctuation: "<" [17:35 - 17:36] UsingDeclaration=iterator[5:18]
54dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Identifier: "X" [17:36 - 17:37] TypeRef=struct X:12:8
55dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Punctuation: ">" [17:37 - 17:38] UsingDeclaration=iterator[5:18]
56dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Punctuation: "::" [17:38 - 17:40] UsingDeclaration=iterator[5:18]
57dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor// CHECK: Identifier: "iterator" [17:40 - 17:48] OverloadedDeclRef=iterator[5:18]
58c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
59c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor// FIXME: Check nested-name-specifiers on VarDecl, CXXMethodDecl.
60