mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-25 10:48:14 +00:00
[CodeComplete] Fix crash when completing ObjC block parameter with a broken type
Summary: The fix isn't great, but it's hard to fix properly because the completion code sensibly uses ParmVarDecl to represent parameters, but the AST-building code sensibly doesn't synthesize them if the type is broken. Also this case is apparently really rare, so it's probably not worth bending over backwards for. Reviewers: ilya-biryukov Subscribers: javed.absar, kristof.beyls, arphaman, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D60258 llvm-svn: 357686
This commit is contained in:
parent
937bc02fd6
commit
bc7ff89964
@ -2605,6 +2605,11 @@ static std::string
|
||||
FormatFunctionParameter(const PrintingPolicy &Policy, const ParmVarDecl *Param,
|
||||
bool SuppressName = false, bool SuppressBlock = false,
|
||||
Optional<ArrayRef<QualType>> ObjCSubsts = None) {
|
||||
// Params are unavailable in FunctionTypeLoc if the FunctionType is invalid.
|
||||
// It would be better to pass in the param Type, which is usually avaliable.
|
||||
// But this case is rare, so just pretend we fell back to int as elsewhere.
|
||||
if (!Param)
|
||||
return "int";
|
||||
bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext());
|
||||
if (Param->getType()->isDependentType() ||
|
||||
!Param->getType()->isBlockPointerType()) {
|
||||
|
@ -50,6 +50,15 @@ void test_f2(I1 *o) {
|
||||
[o method7:0];
|
||||
}
|
||||
|
||||
// Crash regression test. Param info for broken function types isn't available.
|
||||
typedef UnresolvedType *(^XXX)(float);
|
||||
@interface Foo
|
||||
-(void) foo:(XXX)arg;
|
||||
@end
|
||||
void testUnresolved(Foo* f) {
|
||||
[f foo:0];
|
||||
}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:8:1 %s | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// CHECK-CC1: FunctionDecl:{ResultType void}{TypedText f}{LeftParen (}{Placeholder ^int(int x, int y)block}{RightParen )} (50)
|
||||
// CHECK-CC1: FunctionDecl:{ResultType void}{TypedText g}{LeftParen (}{Placeholder ^(float f, double d)b}{RightParen )} (50)
|
||||
@ -74,3 +83,6 @@ void test_f2(I1 *o) {
|
||||
// CHECK-CC7: FunctionDecl:{ResultType void}{TypedText f2}{LeftParen (}{Placeholder ^int(int x, int y)block}{RightParen )} (50)
|
||||
// RUN: c-index-test -code-completion-at=%s:50:6 %s | FileCheck -check-prefix=CHECK-CC8 %s
|
||||
// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType id}{TypedText method7:}{Placeholder ^int(int x, int y)b} (35)
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:59:6 %s | FileCheck -check-prefix=CHECK-CC9 %s
|
||||
// CHECK-CC9: ObjCInstanceMethodDecl:{ResultType void}{TypedText foo:}{Placeholder ^int *(int)arg} (35)
|
||||
|
Loading…
x
Reference in New Issue
Block a user