[clang] a9db0a8 - [AST] Fix the EndLoc calculation for ObjCObjectPointer
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 26 11:03:45 PDT 2021
Author: Luke Petre
Date: 2021-10-26T14:03:29-04:00
New Revision: a9db0a804a5335b6534995c54ab9d6fcef06e739
URL: https://github.com/llvm/llvm-project/commit/a9db0a804a5335b6534995c54ab9d6fcef06e739
DIFF: https://github.com/llvm/llvm-project/commit/a9db0a804a5335b6534995c54ab9d6fcef06e739.diff
LOG: [AST] Fix the EndLoc calculation for ObjCObjectPointer
There is an issue where the AST code does not compute the correct SourceRange
for a ObjCObjectPointer.
>From Richard Smith (ie @zygoloid) in discord:
I think the problem is that we set an invalid location for the * (because there
isn't one): https://github.com/llvm/llvm-project/blob/main/clang/lib/Sema/SemaType.cpp#L1121
And then we use the default getLocalSourceRangeImpl for a PointerLikeTypeLoc
that just assumes the * location is the type's end location:
https://github.com/llvm/llvm-project/blob/main/clang/include/clang/AST/TypeLoc.h#L1293
Possibly we should be special-casing that here:
https://github.com/llvm/llvm-project/blob/main/clang/lib/AST/TypeLoc.cpp#L228
My change:
introduces a AST dump test to show the issue in the first commit
special cases ObjCObjectPointerType in the second commit to correctly compute
the end location
Added:
Modified:
clang/lib/AST/TypeLoc.cpp
clang/test/AST/ast-dump-decl.mm
Removed:
################################################################################
diff --git a/clang/lib/AST/TypeLoc.cpp b/clang/lib/AST/TypeLoc.cpp
index e943c873f1fad..712fcac26c95c 100644
--- a/clang/lib/AST/TypeLoc.cpp
+++ b/clang/lib/AST/TypeLoc.cpp
@@ -257,6 +257,7 @@ SourceLocation TypeLoc::getEndLoc() const {
if (!Last)
Last = Cur;
break;
+ case ObjCObjectPointer:
case Qualified:
case Elaborated:
break;
diff --git a/clang/test/AST/ast-dump-decl.mm b/clang/test/AST/ast-dump-decl.mm
index 7dc60e198aaaa..26756722bfdd8 100644
--- a/clang/test/AST/ast-dump-decl.mm
+++ b/clang/test/AST/ast-dump-decl.mm
@@ -55,4 +55,11 @@ void f() {
// CHECK-NEXT: CXXThisExpr {{.*}} <col:8> 'Test *' this
}
void yada();
+ // CHECK: CXXMethodDecl {{.*}} <line:[[@LINE-1]]:3, col:13> col:8 used yada 'void ()'
};
+
+ at protocol P
+ at end;
+
+using TestAlias = id<P>;
+// CHECK: TypeAliasDecl {{.+}} <{{.+}}:[[@LINE-1]]:1, col:23> col:7 TestAlias 'id<P>'
More information about the cfe-commits
mailing list