aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/AST/ASTContext.cpp3
-rw-r--r--lib/Sema/SemaExpr.cpp9
-rw-r--r--test/Sema/block-literal.c4
3 files changed, 8 insertions, 8 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index c5441dd304..c656d966db 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -2469,7 +2469,8 @@ bool ASTContext::isObjCObjectPointerType(QualType Ty) const {
// Check to see if this is 'id' or 'Class', both of which are typedefs for
// pointer types. This looks for the typedef specifically, not for the
// underlying type.
- if (Ty == getObjCIdType() || Ty == getObjCClassType())
+ if (Ty.getUnqualifiedType() == getObjCIdType() ||
+ Ty.getUnqualifiedType() == getObjCClassType())
return true;
// If this a pointer to an interface (e.g. NSString*), it is ok.
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 079ff74d79..3220a9e461 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -932,15 +932,14 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc,
// Blocks that have these can't be constant.
CurBlock->hasBlockDeclRefExprs = true;
+ QualType ExprTy = VD->getType().getNonReferenceType();
// The BlocksAttr indicates the variable is bound by-reference.
if (VD->getAttr<BlocksAttr>())
- return Owned(new (Context) BlockDeclRefExpr(VD,
- VD->getType().getNonReferenceType(), Loc, true));
+ return Owned(new (Context) BlockDeclRefExpr(VD, ExprTy, Loc, true));
// Variable will be bound by-copy, make it const within the closure.
- VD->getType().addConst();
- return Owned(new (Context) BlockDeclRefExpr(VD,
- VD->getType().getNonReferenceType(), Loc, false));
+ ExprTy.addConst();
+ return Owned(new (Context) BlockDeclRefExpr(VD, ExprTy, Loc, false));
}
// If this reference is not in a block or if the referenced variable is
// within the block, create a normal DeclRefExpr.
diff --git a/test/Sema/block-literal.c b/test/Sema/block-literal.c
index 7f64c03c1b..290cef1fed 100644
--- a/test/Sema/block-literal.c
+++ b/test/Sema/block-literal.c
@@ -39,7 +39,7 @@ void test2() {
}
foo:
- takeclosure(^{ x = 4; }); // expected-error {{variable is not assignable (missing __block type specifier)}}
+ takeclosure(^{ x = 4; }); // expected-error {{read-only variable is not assignable}}
__block y = 7; // expected-warning {{type specifier missing, defaults to 'int'}}
takeclosure(^{ y = 8; });
}
@@ -56,7 +56,7 @@ void test4() {
void myfunc(int (^block)(int)) {}
-void myfunc3(int *x);
+void myfunc3(const int *x);
void test5() {
int a;