From: Steve Naroff Date: Wed, 24 Sep 2008 22:26:48 +0000 (+0000) Subject: Fix clang: Incorrect return statement for Blocks? X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=16564420ffe679b0e3cf310c418be6ef98d8e658;p=clang Fix clang: Incorrect return statement for Blocks? git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56590 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 3cadd526a7..df832b70dc 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -679,7 +679,9 @@ Sema::ActOnBlockReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) { // the block from it. if (CurBlock->ReturnType == 0) { if (RetValExp) { - UsualUnaryConversions(RetValExp); + // Don't call UsualUnaryConversions(), since we don't want to do + // integer promotions here. + DefaultFunctionArrayConversion(RetValExp); CurBlock->ReturnType = RetValExp->getType().getTypePtr(); } else CurBlock->ReturnType = Context.VoidTy.getTypePtr(); diff --git a/test/Sema/block-return.c b/test/Sema/block-return.c index 93511dbd7e..2110f2ce45 100644 --- a/test/Sema/block-return.c +++ b/test/Sema/block-return.c @@ -50,3 +50,23 @@ typedef int (^CL2)(void); CL2 foo2() { return ^{ return 1; }; // expected-error {{returning block that lives on the local stack}} } + +typedef unsigned int * uintptr_t; +typedef char Boolean; +typedef int CFBasicHash; + +#define INVOKE_CALLBACK2(P, A, B) (P)(A, B) + +typedef struct { + Boolean (^isEqual)(const CFBasicHash *, uintptr_t stack_value_or_key1, uintptr_t stack_value_or_key2, Boolean is_key); +} CFBasicHashCallbacks; + +int foo3() { + CFBasicHashCallbacks cb; + + Boolean (*value_equal)(uintptr_t, uintptr_t) = 0; + + cb.isEqual = ^(const CFBasicHash *table, uintptr_t stack_value_or_key1, uintptr_t stack_value_or_key2, Boolean is_key) { + return (Boolean)(uintptr_t)INVOKE_CALLBACK2(value_equal, (uintptr_t)stack_value_or_key1, (uintptr_t)stack_value_or_key2); + }; +}