aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-05-26 02:03:20 +0000
committerAnders Carlsson <andersca@mac.com>2009-05-26 02:03:20 +0000
commit5e5783180acb42c9d9b1be2838370ea5930a2a8b (patch)
tree27c3f72c9c46028da56a89779b3a835bdbc9cf5a
parentc6c14d1cd68afcd90d097715296377f15be45210 (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.cpp3
-rw-r--r--test/SemaCXX/blocks.cpp4
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;
+}