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