[cfe-commits] r101196 - in /cfe/trunk: lib/AST/ASTContext.cpp test/CodeGenCXX/reference-in-blocks.cpp test/CodeGenObjCXX/mangle.mm
Fariborz Jahanian
fjahanian at apple.com
Tue Apr 13 16:45:47 PDT 2010
Author: fjahanian
Date: Tue Apr 13 18:45:47 2010
New Revision: 101196
URL: http://llvm.org/viewvc/llvm-project?rev=101196&view=rev
Log:
Add encoding of reference types like gcc does for objc methods and
blocks. Fixes PR6468.
Added:
cfe/trunk/test/CodeGenCXX/reference-in-blocks.cpp
Modified:
cfe/trunk/lib/AST/ASTContext.cpp
cfe/trunk/test/CodeGenObjCXX/mangle.mm
Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=101196&r1=101195&r2=101196&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Tue Apr 13 18:45:47 2010
@@ -3494,13 +3494,18 @@
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 @@
NULL);
return;
}
-
+
if (const ArrayType *AT =
// Ignore type qualifiers etc.
dyn_cast<ArrayType>(T->getCanonicalTypeInternal())) {
Added: cfe/trunk/test/CodeGenCXX/reference-in-blocks.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/reference-in-blocks.cpp?rev=101196&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/reference-in-blocks.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/reference-in-blocks.cpp Tue Apr 13 18:45:47 2010
@@ -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;
+}
+
Modified: cfe/trunk/test/CodeGenObjCXX/mangle.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/mangle.mm?rev=101196&r1=101195&r2=101196&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjCXX/mangle.mm (original)
+++ cfe/trunk/test/CodeGenObjCXX/mangle.mm Tue Apr 13 18:45:47 2010
@@ -2,6 +2,7 @@
// CHECK: @"_ZZ11+[A shared]E1a" = internal global
// CHECK: @"_ZZ11-[A(Foo) f]E1a" = internal global
+// CHECK: v56 at 0:8i16i20i24i28i32i36i40i44^i48
@interface A
@end
@@ -30,3 +31,14 @@
return 0;
}
@end
+
+// PR6468
+ at interface Test
+- (void) process: (int)r3 :(int)r4 :(int)r5 :(int)r6 :(int)r7 :(int)r8 :(int)r9 :(int)r10 :(int &)i;
+ at end
+
+ at implementation Test
+- (void) process: (int)r3 :(int)r4 :(int)r5 :(int)r6 :(int)r7 :(int)r8 :(int)r9 :(int)r10 :(int &)i {
+}
+ at end
+
More information about the cfe-commits
mailing list