]> granicus.if.org Git - clang/commitdiff
Fix code to mark block variables as const to actually work. Fix
authorEli Friedman <eli.friedman@gmail.com>
Sun, 22 Mar 2009 23:00:19 +0000 (23:00 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sun, 22 Mar 2009 23:00:19 +0000 (23:00 +0000)
isObjCObjectPointerType to work with qualified types.  Adjust test for
changes.

If the SemaExpr changes are wrong or break existing code, feel free to
delete the "ExprTy.addConst();" line and revert my changes to
test/Sema/block-literal.c.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67489 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
lib/Sema/SemaExpr.cpp
test/Sema/block-literal.c

index c5441dd3041bccfa03e8308aab1430f6367f3626..c656d966db3a16a2dc4697bb19800f6b8d55bc9c 100644 (file)
@@ -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.
index 079ff74d79590532852b079f63b2b378b9758ff2..3220a9e46191f83657cb646ae0b94245b9e4ca10 100644 (file)
@@ -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.
index 7f64c03c1bb0b4cdf00f0786a822b21e997765b8..290cef1fed627f434efb2b699f6fe34cfaafc0e0 100644 (file)
@@ -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;