Author: Richard Smith Date: 2021-10-29T13:15:53-07:00 New Revision: 68ffcd521347e3c8b97ca233239d503beff239f4
URL: https://github.com/llvm/llvm-project/commit/68ffcd521347e3c8b97ca233239d503beff239f4 DIFF: https://github.com/llvm/llvm-project/commit/68ffcd521347e3c8b97ca233239d503beff239f4.diff LOG: Properly determine the end location of an ObjCObjectPointerType. After rGa9db0a804a53, we correctly determined the end for pointer types like `id` that are spelled without a `*`, but incorrectly determined the end for pointer types spelled with a `*`. 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 712fcac26c95c..c3ed08d5a8b3e 100644 --- a/clang/lib/AST/TypeLoc.cpp +++ b/clang/lib/AST/TypeLoc.cpp @@ -240,6 +240,8 @@ SourceLocation TypeLoc::getEndLoc() const { case IncompleteArray: case VariableArray: case FunctionNoProto: + // The innermost type with suffix syntax always determines the end of the + // type. Last = Cur; break; case FunctionProto: @@ -248,16 +250,22 @@ SourceLocation TypeLoc::getEndLoc() const { else Last = Cur; break; + case ObjCObjectPointer: + // `id` and `id<...>` have no star location. + if (Cur.castAs<ObjCObjectPointerTypeLoc>().getStarLoc().isInvalid()) + break; + LLVM_FALLTHROUGH; case Pointer: case BlockPointer: case MemberPointer: case LValueReference: case RValueReference: case PackExpansion: + // Types with prefix syntax only determine the end of the type if there + // is no suffix type. 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 26756722bfdd8..16ca27e3b139c 100644 --- a/clang/test/AST/ast-dump-decl.mm +++ b/clang/test/AST/ast-dump-decl.mm @@ -61,5 +61,8 @@ void f() { @protocol P @end; -using TestAlias = id<P>; -// CHECK: TypeAliasDecl {{.+}} <{{.+}}:[[@LINE-1]]:1, col:23> col:7 TestAlias 'id<P>' +using TestObjCPointerWithoutStar = id<P>; +// CHECK: TypeAliasDecl {{.+}} <{{.+}}:[[@LINE-1]]:1, col:40> col:7 TestObjCPointerWithoutStar 'id<P>' + +using TestObjCPointerWithStar = A *; +// CHECK: TypeAliasDecl {{.+}} <{{.+}}:[[@LINE-1]]:1, col:35> col:7 TestObjCPointerWithStar 'A *' _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits