lpetre created this revision.
lpetre updated this revision to Diff 381958.
lpetre added a comment.
lpetre updated this revision to Diff 381960.
lpetre retitled this revision from "Fix the EndLoc calculation for
ObjCObjectPointer" to "[AST] Fix the EndLoc calculation for ObjCObjectPointer".
lpetre edited the summary of this revision.
lpetre added a reviewer: rsmith.
lpetre added a project: clang.
lpetre published this revision for review.
Herald added a subscriber: cfe-commits.
Updating diff with full commit range
My initial arc diff only picked up the final commit, now running for all commits
lpetre added a comment.
Trying again to include both commits
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
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D112101
Files:
clang/lib/AST/TypeLoc.cpp
clang/test/AST/ast-dump-decl.mm
Index: clang/test/AST/ast-dump-decl.mm
===================================================================
--- clang/test/AST/ast-dump-decl.mm
+++ clang/test/AST/ast-dump-decl.mm
@@ -55,4 +55,11 @@
// CHECK-NEXT: CXXThisExpr {{.*}} <col:8> 'Test *' this
}
void yada();
+ // CHECK: CXXMethodDecl {{.*}} <line:[[@LINE-1]]:3, col:13> col:8 used
yada 'void ()'
};
+
+@protocol P
+@end;
+
+using TestAlias = id<P>;
+// CHECK: TypeAliasDecl {{.+}} <{{.+}}:[[@LINE-1]]:1, col:23> col:7
TestAlias 'id<P>'
Index: clang/lib/AST/TypeLoc.cpp
===================================================================
--- clang/lib/AST/TypeLoc.cpp
+++ clang/lib/AST/TypeLoc.cpp
@@ -257,6 +257,7 @@
if (!Last)
Last = Cur;
break;
+ case ObjCObjectPointer:
case Qualified:
case Elaborated:
break;
Index: clang/test/AST/ast-dump-decl.mm
===================================================================
--- clang/test/AST/ast-dump-decl.mm
+++ clang/test/AST/ast-dump-decl.mm
@@ -55,4 +55,11 @@
// CHECK-NEXT: CXXThisExpr {{.*}} <col:8> 'Test *' this
}
void yada();
+ // CHECK: CXXMethodDecl {{.*}} <line:[[@LINE-1]]:3, col:13> col:8 used yada 'void ()'
};
+
+@protocol P
+@end;
+
+using TestAlias = id<P>;
+// CHECK: TypeAliasDecl {{.+}} <{{.+}}:[[@LINE-1]]:1, col:23> col:7 TestAlias 'id<P>'
Index: clang/lib/AST/TypeLoc.cpp
===================================================================
--- clang/lib/AST/TypeLoc.cpp
+++ clang/lib/AST/TypeLoc.cpp
@@ -257,6 +257,7 @@
if (!Last)
Last = Cur;
break;
+ case ObjCObjectPointer:
case Qualified:
case Elaborated:
break;
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits