steveire created this revision.
steveire added a reviewer: rsmith.
steveire requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

All other CallExpr use the location of the member name as the
getExprLoc:

  https://godbolt.org/z/jx16G9Gdr


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D101346

Files:
  clang/include/clang/AST/ExprCXX.h
  clang/unittests/AST/SourceLocationTest.cpp


Index: clang/unittests/AST/SourceLocationTest.cpp
===================================================================
--- clang/unittests/AST/SourceLocationTest.cpp
+++ clang/unittests/AST/SourceLocationTest.cpp
@@ -634,6 +634,39 @@
                              friendDecl()));
 }
 
+TEST(CXXDependentScopeMemberExpr, ExprLocation) {
+
+  llvm::Annotations Example(R"cpp(
+template<typename T>
+struct MyContainer
+{
+    template <typename U>
+    void pushBack();
+
+    void foo();
+};
+
+template<typename T>
+struct Derived : MyContainer<T>
+{
+    void bar()
+    {
+        MyContainer<T>::template $member_name^pushBack<int>();
+    }
+};
+  )cpp");
+
+  auto AST = tooling::buildASTFromCode(Example.code());
+  SourceManager &SM = AST->getSourceManager();
+  auto &Ctx = AST->getASTContext();
+
+  auto *M = selectFirst<CXXDependentScopeMemberExpr>(
+      "mem", match(cxxDependentScopeMemberExpr().bind("mem"), Ctx));
+  ASSERT_TRUE(M != nullptr);
+
+  ASSERT_EQ(SM.getFileOffset(M->getExprLoc()), Example.point("member_name"));
+}
+
 TEST(FriendDecl, FriendTemplateClassRange) {
   RangeVerifier<FriendDecl> Verifier;
   Verifier.expectRange(2, 1, 3, 14);
Index: clang/include/clang/AST/ExprCXX.h
===================================================================
--- clang/include/clang/AST/ExprCXX.h
+++ clang/include/clang/AST/ExprCXX.h
@@ -3774,6 +3774,8 @@
     return MemberNameInfo.getEndLoc();
   }
 
+  SourceLocation getExprLoc() const LLVM_READONLY { return getMemberLoc(); }
+
   static bool classof(const Stmt *T) {
     return T->getStmtClass() == CXXDependentScopeMemberExprClass;
   }


Index: clang/unittests/AST/SourceLocationTest.cpp
===================================================================
--- clang/unittests/AST/SourceLocationTest.cpp
+++ clang/unittests/AST/SourceLocationTest.cpp
@@ -634,6 +634,39 @@
                              friendDecl()));
 }
 
+TEST(CXXDependentScopeMemberExpr, ExprLocation) {
+
+  llvm::Annotations Example(R"cpp(
+template<typename T>
+struct MyContainer
+{
+    template <typename U>
+    void pushBack();
+
+    void foo();
+};
+
+template<typename T>
+struct Derived : MyContainer<T>
+{
+    void bar()
+    {
+        MyContainer<T>::template $member_name^pushBack<int>();
+    }
+};
+  )cpp");
+
+  auto AST = tooling::buildASTFromCode(Example.code());
+  SourceManager &SM = AST->getSourceManager();
+  auto &Ctx = AST->getASTContext();
+
+  auto *M = selectFirst<CXXDependentScopeMemberExpr>(
+      "mem", match(cxxDependentScopeMemberExpr().bind("mem"), Ctx));
+  ASSERT_TRUE(M != nullptr);
+
+  ASSERT_EQ(SM.getFileOffset(M->getExprLoc()), Example.point("member_name"));
+}
+
 TEST(FriendDecl, FriendTemplateClassRange) {
   RangeVerifier<FriendDecl> Verifier;
   Verifier.expectRange(2, 1, 3, 14);
Index: clang/include/clang/AST/ExprCXX.h
===================================================================
--- clang/include/clang/AST/ExprCXX.h
+++ clang/include/clang/AST/ExprCXX.h
@@ -3774,6 +3774,8 @@
     return MemberNameInfo.getEndLoc();
   }
 
+  SourceLocation getExprLoc() const LLVM_READONLY { return getMemberLoc(); }
+
   static bool classof(const Stmt *T) {
     return T->getStmtClass() == CXXDependentScopeMemberExprClass;
   }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to