]> granicus.if.org Git - clang/commitdiff
Add encoding of reference types like gcc does for objc methods and
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 13 Apr 2010 23:45:47 +0000 (23:45 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 13 Apr 2010 23:45:47 +0000 (23:45 +0000)
blocks. Fixes PR6468.

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

lib/AST/ASTContext.cpp
test/CodeGenCXX/reference-in-blocks.cpp [new file with mode: 0644]
test/CodeGenObjCXX/mangle.mm

index 1fa17f0b4b98a116b3a0913b076bcdba96e97e0b..68620dc346bdceb11c570b5b1cd316baeb7c5c3a 100644 (file)
@@ -3494,13 +3494,18 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
     return;
   }
   
+  // encoding for pointer or r3eference types.
+  QualType PointeeTy;
   if (const PointerType *PT = T->getAs<PointerType>()) {
     if (PT->isObjCSelType()) {
       S += ':';
       return;
     }
-    QualType PointeeTy = PT->getPointeeType();
-    
+    PointeeTy = PT->getPointeeType();
+  }
+  else if (const ReferenceType *RT = T->getAs<ReferenceType>())
+    PointeeTy = RT->getPointeeType();
+  if (!PointeeTy.isNull()) {
     bool isReadOnly = false;
     // For historical/compatibility reasons, the read-only qualifier of the
     // pointee gets emitted _before_ the '^'.  The read-only qualifier of
@@ -3559,7 +3564,7 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
                                NULL);
     return;
   }
-
+  
   if (const ArrayType *AT =
       // Ignore type qualifiers etc.
         dyn_cast<ArrayType>(T->getCanonicalTypeInternal())) {
diff --git a/test/CodeGenCXX/reference-in-blocks.cpp b/test/CodeGenCXX/reference-in-blocks.cpp
new file mode 100644 (file)
index 0000000..ef09e43
--- /dev/null
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -fblocks %s -emit-llvm 
+
+extern "C" int printf(const char*, ...);
+
+template<typename T> class range {
+public:
+T _i;
+        range(T i) {_i = i;};
+        T get() {return _i;};
+};
+
+int main() {
+
+        // works
+        void (^bl)(range<int> ) = ^(range<int> i){printf("Hello Blocks %d\n", i.get()); };
+
+        //crashes in godegen?
+        void (^bl2)(range<int>& ) = ^(range<int>& i){printf("Hello Blocks %d\n", i.get()); };
+        return 0;
+}
+
index d277c4e51581bec23ab54342d654c5967f3961f0..7a75a5b40e4c6d0feffcfc3f9137b9d5e1bfc59c 100644 (file)
@@ -2,6 +2,7 @@
 
 // CHECK: @"_ZZ11+[A shared]E1a" = internal global
 // CHECK: @"_ZZ11-[A(Foo) f]E1a" = internal global
+// CHECK: v56@0:8i16i20i24i28i32i36i40i44^i48
 
 @interface A
 @end
   return 0;
 }
 @end
+
+// PR6468
+@interface Test
+- (void) process: (int)r3 :(int)r4 :(int)r5 :(int)r6 :(int)r7 :(int)r8 :(int)r9 :(int)r10 :(int &)i;
+@end
+
+@implementation Test
+- (void) process: (int)r3 :(int)r4 :(int)r5 :(int)r6 :(int)r7 :(int)r8 :(int)r9 :(int)r10 :(int &)i {
+}
+@end
+