diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 9f770cee0312..2a78c981b448 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -2264,9 +2264,13 @@ static std::string FormatFunctionParameter(const PrintingPolicy &Policy, QualType Type = Param->getType().getUnqualifiedType(); if (ObjCMethodParam) { - Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier(), - Type); - Result += Type.getAsString(Policy) + Result + ")"; + Result = Type.getAsString(Policy); + std::string Quals = + formatObjCParamQualifiers(Param->getObjCDeclQualifier(), Type); + if (!Quals.empty()) + Result = "(" + Quals + " " + Result + ")"; + if (Result.back() != ')') + Result += " "; if (Param->getIdentifier()) Result += Param->getIdentifier()->getName(); } else { @@ -2275,7 +2279,7 @@ static std::string FormatFunctionParameter(const PrintingPolicy &Policy, return Result; } - + // We have the function prototype behind the block pointer type, as it was // written in the source. return formatBlockPlaceholder(Policy, Param, Block, BlockProto, diff --git a/clang/test/Index/complete-block-properties.m b/clang/test/Index/complete-block-properties.m index ce97a453c5fb..47eee02ba57c 100644 --- a/clang/test/Index/complete-block-properties.m +++ b/clang/test/Index/complete-block-properties.m @@ -51,3 +51,22 @@ typedef int (^BarBlock)(int *); //CHECK-CC1-NEXT: ObjCPropertyDecl:{ResultType int}{TypedText performB}{LeftParen (}{Placeholder int x}{Comma , }{Placeholder int y}{RightParen )} (35) @end + +// rdar://25224416 + +@interface NoQualifierParens + +@property(copy) void (^blockProperty)(void); +@property BarBlock blockProperty2; + +@end + +void noQualifierParens(NoQualifierParens *f) { + [f setBlockProperty: ^{}]; +} + +// RUN: c-index-test -code-completion-at=%s:65:6 %s | FileCheck -check-prefix=CHECK-CC2 %s +//CHECK-CC2: ObjCInstanceMethodDecl:{ResultType void (^)(void)}{TypedText blockProperty} (35) +//CHECK-CC2-NEXT: ObjCInstanceMethodDecl:{ResultType BarBlock}{TypedText blockProperty2} (35) +//CHECK-CC2-NEXT: ObjCInstanceMethodDecl:{ResultType void}{TypedText setBlockProperty2:}{Placeholder BarBlock blockProperty2} (35) +//CHECK-CC2-NEXT: ObjCInstanceMethodDecl:{ResultType void}{TypedText setBlockProperty:}{Placeholder void (^)(void)blockProperty} (35)