diff options
-rw-r--r-- | lib/AST/ASTContext.cpp | 3 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 9 | ||||
-rw-r--r-- | test/Sema/block-literal.c | 4 |
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; |