aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra/clangd/unittests/SelectionTests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/unittests/SelectionTests.cpp')
-rw-r--r--clang-tools-extra/clangd/unittests/SelectionTests.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
index 3df19d8..63c0403 100644
--- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -311,6 +311,19 @@ TEST(SelectionTest, CommonAncestor) {
{"[[void foo^()]];", "FunctionProtoTypeLoc"},
{"[[^void foo^()]];", "FunctionDecl"},
{"[[void ^foo()]];", "FunctionDecl"},
+ // Tricky case: with function attributes, the AttributedTypeLoc's range
+ // includes the function name, but we want the name to be associated with
+ // the CXXMethodDecl.
+ {"struct X { [[const int* ^Get() const <:[clang::lifetimebound]:> "
+ "{return nullptr;}]]; };",
+ "CXXMethodDecl"},
+ // When the cursor is on the attribute itself, we should select the
+ // AttributedTypeLoc. Note: Due to a bug or deliberate quirk in the AST
+ // modeling of AttributedTypeLoc, its range ends at the attribute name
+ // token, not including the closing brackets ":>:>".
+ {"struct X { const [[int* Foo() const <:<:clang::life^timebound]]:>:> "
+ "{return nullptr;}; };",
+ "AttributedTypeLoc"},
// Tricky case: two VarDecls share a specifier.
{"[[int ^a]], b;", "VarDecl"},
{"[[int a, ^b]];", "VarDecl"},