diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-18 20:31:02 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-18 20:31:02 +0000 |
| commit | ffcfecdc1f2f0f92d2a5b41ec0725b2e92fe8622 (patch) | |
| tree | c859a0038e7b060c2d7490b2ff7e0e8acf1df654 | |
| parent | 81d53769b5f7029a2c8bb1ebb4dc3ea3c2cb59b6 (diff) | |
| download | bcm5719-llvm-ffcfecdc1f2f0f92d2a5b41ec0725b2e92fe8622.tar.gz bcm5719-llvm-ffcfecdc1f2f0f92d2a5b41ec0725b2e92fe8622.zip | |
Fixed a crash specific to blocks in c++ uncovered by an internal
test suite.
llvm-svn: 96608
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 4 | ||||
| -rw-r--r-- | clang/test/SemaCXX/blocks-1.cpp | 35 |
2 files changed, 38 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 4098d0f2cf2..3cbba8c9ff5 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -2221,7 +2221,9 @@ Sema::OwningExprResult Sema::MaybeBindToTemporary(Expr *E) { QualType Ty = CE->getCallee()->getType(); if (const PointerType *PT = Ty->getAs<PointerType>()) Ty = PT->getPointeeType(); - + else if (const BlockPointerType *BPT = Ty->getAs<BlockPointerType>()) + Ty = BPT->getPointeeType(); + const FunctionType *FTy = Ty->getAs<FunctionType>(); if (FTy->getResultType()->isReferenceType()) return Owned(E); diff --git a/clang/test/SemaCXX/blocks-1.cpp b/clang/test/SemaCXX/blocks-1.cpp new file mode 100644 index 00000000000..d93997ad683 --- /dev/null +++ b/clang/test/SemaCXX/blocks-1.cpp @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks + +extern "C" int exit(int); + +typedef struct { + unsigned long ps[30]; + int qs[30]; +} BobTheStruct; + +int main (int argc, const char * argv[]) { + BobTheStruct inny; + BobTheStruct outty; + BobTheStruct (^copyStruct)(BobTheStruct); + int i; + + for(i=0; i<30; i++) { + inny.ps[i] = i * i * i; + inny.qs[i] = -i * i * i; + } + + copyStruct = ^(BobTheStruct aBigStruct){ return aBigStruct; }; // pass-by-value intrinsically copies the argument + + outty = copyStruct(inny); + + if ( &inny == &outty ) { + exit(1); + } + for(i=0; i<30; i++) { + if ( (inny.ps[i] != outty.ps[i]) || (inny.qs[i] != outty.qs[i]) ) { + exit(1); + } + } + + return 0; +} |

