1*f2f0806fSDouglas Gregor class Base {
2*f2f0806fSDouglas Gregor public:
3*f2f0806fSDouglas Gregor   virtual void f();
4*f2f0806fSDouglas Gregor };
5*f2f0806fSDouglas Gregor 
6*f2f0806fSDouglas Gregor class Derived final : public Base {
7*f2f0806fSDouglas Gregor   virtual void f() override final;
8*f2f0806fSDouglas Gregor 
9*f2f0806fSDouglas Gregor   struct final { };
10*f2f0806fSDouglas Gregor };
11*f2f0806fSDouglas Gregor 
12*f2f0806fSDouglas Gregor typedef int override;
13*f2f0806fSDouglas Gregor struct Base2 {
14*f2f0806fSDouglas Gregor   virtual int override();
15*f2f0806fSDouglas Gregor };
16*f2f0806fSDouglas Gregor 
17*f2f0806fSDouglas Gregor struct Derived2 : Base2 {
18*f2f0806fSDouglas Gregor   ::override override() override;
19*f2f0806fSDouglas Gregor };
20*f2f0806fSDouglas Gregor 
21*f2f0806fSDouglas Gregor // RUN: c-index-test -test-annotate-tokens=%s:6:1:19:1 %s | FileCheck -check-prefix=CHECK-OVERRIDE-FINAL %s
22*f2f0806fSDouglas Gregor 
23*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Keyword: "class" [6:1 - 6:6] ClassDecl=Derived:6:7 (Definition)
24*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Identifier: "Derived" [6:7 - 6:14] ClassDecl=Derived:6:7 (Definition)
25*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Keyword: "final" [6:15 - 6:20] ClassDecl=Derived:6:7 (Definition)
26*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Punctuation: ":" [6:21 - 6:22] ClassDecl=Derived:6:7 (Definition)
27*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Keyword: "public" [6:23 - 6:29] C++ base class specifier=class Base:1:7 [access=public isVirtual=false]
28*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Identifier: "Base" [6:30 - 6:34] TypeRef=class Base:1:7
29*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Punctuation: "{" [6:35 - 6:36] ClassDecl=Derived:6:7 (Definition)
30*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Keyword: "virtual" [7:3 - 7:10] ClassDecl=Derived:6:7 (Definition)
31*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Keyword: "void" [7:11 - 7:15] CXXMethod=f:7:16 [Overrides @3:16]
32*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Identifier: "f" [7:16 - 7:17] CXXMethod=f:7:16 [Overrides @3:16]
33*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Punctuation: "(" [7:17 - 7:18] CXXMethod=f:7:16 [Overrides @3:16]
34*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Punctuation: ")" [7:18 - 7:19] CXXMethod=f:7:16 [Overrides @3:16]
35*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Keyword: "override" [7:20 - 7:28] CXXMethod=f:7:16 [Overrides @3:16]
36*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Keyword: "final" [7:29 - 7:34] CXXMethod=f:7:16 [Overrides @3:16]
37*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Punctuation: ";" [7:34 - 7:35] ClassDecl=Derived:6:7 (Definition)
38*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Keyword: "struct" [9:3 - 9:9] StructDecl=final:9:10 (Definition)
39*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Identifier: "final" [9:10 - 9:15] StructDecl=final:9:10 (Definition)
40*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Punctuation: "{" [9:16 - 9:17] StructDecl=final:9:10 (Definition)
41*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Punctuation: "}" [9:18 - 9:19] StructDecl=final:9:10 (Definition)
42*f2f0806fSDouglas Gregor // CHECK-OVERRIDE-FINAL: Punctuation: ";" [9:19 - 9:20] ClassDecl=Derived:6:7 (Definition)
43