diff options
author | Anders Carlsson <andersca@mac.com> | 2009-05-26 02:03:20 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-05-26 02:03:20 +0000 |
commit | 5e5783180acb42c9d9b1be2838370ea5930a2a8b (patch) | |
tree | 27c3f72c9c46028da56a89779b3a835bdbc9cf5a | |
parent | c6c14d1cd68afcd90d097715296377f15be45210 (diff) |
A block that returns a reference is an lvalue.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72409 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/Expr.cpp | 3 | ||||
-rw-r--r-- | test/SemaCXX/blocks.cpp | 4 |
2 files changed, 7 insertions, 0 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 81936efb08..fbc8889567 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -776,6 +776,9 @@ Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const { QualType CalleeType = cast<CallExpr>(this)->getCallee()->getType(); if (const PointerType *FnTypePtr = CalleeType->getAsPointerType()) CalleeType = FnTypePtr->getPointeeType(); + else if (const BlockPointerType *BPT = CalleeType->getAsBlockPointerType()) + CalleeType = BPT->getPointeeType(); + if (const FunctionType *FnType = CalleeType->getAsFunctionType()) if (FnType->getResultType()->isLValueReferenceType()) return LV_Valid; diff --git a/test/SemaCXX/blocks.cpp b/test/SemaCXX/blocks.cpp index 837fb0423b..9d789bb325 100644 --- a/test/SemaCXX/blocks.cpp +++ b/test/SemaCXX/blocks.cpp @@ -5,3 +5,7 @@ void tovoid(void*); void tovoid_test(int (^f)(int, int)) { tovoid(f); } + +void reference_lvalue_test(int& (^f)()) { + f() = 10; +} |