diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index e6dea7cca955..5c886b8983ad 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2853,12 +2853,6 @@ QualType::GCAttrTypes ASTContext::getObjCGCAttrKind(const QualType &Ty) const { /// FIXME: When the dust settles on this integration, fold this into mergeTypes. /// bool ASTContext::typesAreBlockCompatible(QualType lhs, QualType rhs) { - const FunctionType *lbase = lhs->getAsFunctionType(); - const FunctionType *rbase = rhs->getAsFunctionType(); - const FunctionProtoType *lproto = dyn_cast(lbase); - const FunctionProtoType *rproto = dyn_cast(rbase); - if (lproto && rproto == 0) - return false; return !mergeTypes(lhs, rhs).isNull(); } diff --git a/clang/lib/Frontend/RewriteBlocks.cpp b/clang/lib/Frontend/RewriteBlocks.cpp index 9d73d90554ce..8393574d1e66 100644 --- a/clang/lib/Frontend/RewriteBlocks.cpp +++ b/clang/lib/Frontend/RewriteBlocks.cpp @@ -1011,9 +1011,7 @@ Stmt *RewriteBlocks::RewriteFunctionBody(Stmt *S) { CI != E; ++CI) if (*CI) { if (BlockExpr *CBE = dyn_cast(*CI)) { - Stmt *newStmt = RewriteFunctionBody(CBE->getBody()); - if (newStmt) - *CI = newStmt; + RewriteFunctionBody(CBE->getBody()); // We've just rewritten the block body in place. // Now we snarf the rewritten text and stash it away for later use. @@ -1023,9 +1021,7 @@ Stmt *RewriteBlocks::RewriteFunctionBody(Stmt *S) { // Do the rewrite, using S.size() which contains the rewritten size. ReplaceText(CBE->getLocStart(), S.size(), Init.c_str(), Init.size()); } else { - Stmt *newStmt = RewriteFunctionBody(*CI); - if (newStmt) - *CI = newStmt; + RewriteFunctionBody(*CI); } } // Handle specific things. diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index ee5132a7d8e0..98d3a23e6007 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -5220,7 +5220,7 @@ Sema::OwningExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc, QualType BlockTy; if (!BSI->hasPrototype) - BlockTy = Context.getFunctionNoProtoType(RetTy); + BlockTy = Context.getFunctionType(RetTy, 0, 0, false, 0); else BlockTy = Context.getFunctionType(RetTy, ArgTypes.data(), ArgTypes.size(), BSI->isVariadic, 0); diff --git a/clang/test/Sema/block-args.c b/clang/test/Sema/block-args.c index a2d8e5a86731..27bee77da6c6 100644 --- a/clang/test/Sema/block-args.c +++ b/clang/test/Sema/block-args.c @@ -18,7 +18,7 @@ void test() { ^{return 1;}(); ^{return 2;}(arg); // expected-error {{too many arguments to block call}} ^(void){return 3;}(1); // expected-error {{too many arguments to block call}} - ^(){return 4;}(arg); // C style (...), ok. + ^(){return 4;}(arg); // expected-error {{too many arguments to block call}} ^(int x, ...){return 5;}(arg, arg); // Explicit varargs, ok. } diff --git a/clang/test/Sema/block-call.c b/clang/test/Sema/block-call.c index 9d3ff71e2195..c42b642337ca 100644 --- a/clang/test/Sema/block-call.c +++ b/clang/test/Sema/block-call.c @@ -7,10 +7,10 @@ int main() { int (*FPL) (int) = FP; // C doesn't consider this an error. // For Blocks, the ASTContext::typesAreBlockCompatible() makes sure this is an error. - int (^PFR) (int) = IFP; // expected-error {{incompatible block pointer types initializing 'int (^)()', expected 'int (^)(int)'}} + int (^PFR) (int) = IFP; // OK PFR = II; // OK - int (^IFP) () = PFR; + int (^IFP) () = PFR; // OK const int (^CIC) () = IFP; // expected-error {{incompatible block pointer types initializing 'int (^)()', expected 'int const (^)()'}} diff --git a/clang/test/Sema/block-misc.c b/clang/test/Sema/block-misc.c index 93ca3c49d425..294c295c5f8c 100644 --- a/clang/test/Sema/block-misc.c +++ b/clang/test/Sema/block-misc.c @@ -10,7 +10,7 @@ int test1() { if (PFR == II) // OK donotwarn(); - if (PFR == IFP) // expected-error {{comparison of distinct block types}} + if (PFR == IFP) // OK donotwarn(); if (PFR == (int (^) (int))IFP) // OK @@ -25,7 +25,7 @@ int test1() { if (!PFR) // OK donotwarn(); - return PFR != IFP; // expected-error {{comparison of distinct block types}} + return PFR != IFP; // OK } int test2(double (^S)()) { @@ -165,7 +165,7 @@ void test17() { f(1 ? bp : vp); f(1 ? vp : bp); - f(1 ? bp : bp1); // expected-error {{incompatible operand types ('void (^)(int)' and 'void (^)()')}} + f(1 ? bp : bp1); (void)(bp > rp); // expected-error {{invalid operands}} (void)(bp > 0); // expected-error {{invalid operands}} (void)(bp > bp); // expected-error {{invalid operands}} diff --git a/clang/test/SemaObjC/blocks.m b/clang/test/SemaObjC/blocks.m index baadbde3e040..6dab289ae9f2 100644 --- a/clang/test/SemaObjC/blocks.m +++ b/clang/test/SemaObjC/blocks.m @@ -28,7 +28,7 @@ void foo5(id (^objectCreationBlock)(int)) { void bar6(id(^)(int)); void foo6(id (^objectCreationBlock)()) { - return bar6(objectCreationBlock); // expected-error {{incompatible block pointer types passing 'id (^)()', expected 'id (^)(int)'}} + return bar6(objectCreationBlock); } void foo7(id (^x)(int)) {