summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorPatrick Beard <pcbeard@mac.com>2012-04-19 00:25:12 +0000
committerPatrick Beard <pcbeard@mac.com>2012-04-19 00:25:12 +0000
commit0caa39474bfc9ca1b4ce64b3318ddaa1d8975232 (patch)
treeed4816aeb2e1961c1a24293ddf74e1c8826a0d43 /clang/test
parent201ba5fa00c789edd594791176f6771f10e85dd1 (diff)
downloadbcm5719-llvm-0caa39474bfc9ca1b4ce64b3318ddaa1d8975232.tar.gz
bcm5719-llvm-0caa39474bfc9ca1b4ce64b3318ddaa1d8975232.zip
Implements boxed expressions for Objective-C. <rdar://problem/10194391>
llvm-svn: 155082
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CodeGenObjC/objc-literal-debugger-test.m16
-rw-r--r--clang/test/Parser/objc-boxing.m26
-rw-r--r--clang/test/Rewriter/objc-modern-boxing.mm68
-rw-r--r--clang/test/SemaObjC/boxing-illegal-types.m17
-rw-r--r--clang/test/SemaTemplate/instantiate-objc-1.mm21
5 files changed, 147 insertions, 1 deletions
diff --git a/clang/test/CodeGenObjC/objc-literal-debugger-test.m b/clang/test/CodeGenObjC/objc-literal-debugger-test.m
index 389ef2248a4..f6a6dfa853c 100644
--- a/clang/test/CodeGenObjC/objc-literal-debugger-test.m
+++ b/clang/test/CodeGenObjC/objc-literal-debugger-test.m
@@ -1,7 +1,8 @@
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fdebugger-objc-literal -emit-llvm -o - %s | FileCheck %s
int main() {
- id l = @'a';
+ // object literals.
+ id l;
l = @'a';
l = @42;
l = @-42;
@@ -11,6 +12,19 @@ int main() {
l = @__objc_no;
l = @{ @"name":@666 };
l = @[ @"foo", @"bar" ];
+
+#if __has_feature(objc_boxed_expressions)
+ // boxed expressions.
+ id b;
+ b = @('a');
+ b = @(42);
+ b = @(-42);
+ b = @(42u);
+ b = @(3.141592654f);
+ b = @(__objc_yes);
+ b = @(__objc_no);
+ b = @("hello");
+#endif
}
// CHECK: declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind
diff --git a/clang/test/Parser/objc-boxing.m b/clang/test/Parser/objc-boxing.m
new file mode 100644
index 00000000000..a16a137b8f6
--- /dev/null
+++ b/clang/test/Parser/objc-boxing.m
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+@interface NSString @end
+
+@interface NSString (NSStringExtensionMethods)
++ (id)stringWithUTF8String:(const char *)nullTerminatedCString;
+@end
+
+extern char *strdup(const char *str);
+
+id constant_string() {
+ return @("boxed constant string.");
+}
+
+id dynamic_string() {
+ return @(strdup("boxed dynamic string"));
+}
+
+id const_char_pointer() {
+ return @((const char *)"constant character pointer");
+}
+
+id missing_parentheses() {
+ return @(5; // expected-error {{expected ')'}} \
+ // expected-note {{to match this '('}}
+}
diff --git a/clang/test/Rewriter/objc-modern-boxing.mm b/clang/test/Rewriter/objc-modern-boxing.mm
new file mode 100644
index 00000000000..9a2ce681d57
--- /dev/null
+++ b/clang/test/Rewriter/objc-modern-boxing.mm
@@ -0,0 +1,68 @@
+// RUN: %clang_cc1 -E %s -o %t.mm
+// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %t.mm -o - | FileCheck %s
+// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %t.mm -o %t-rw.cpp
+// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp -Wno-attributes -Werror
+
+extern char *strdup(const char *str);
+extern "C" void *sel_registerName(const char *);
+
+typedef signed char BOOL;
+typedef long NSInteger;
+typedef unsigned long NSUInteger;
+
+#if __has_feature(objc_bool)
+#define YES __objc_yes
+#define NO __objc_no
+#else
+#define YES ((BOOL)1)
+#define NO ((BOOL)0)
+#endif
+
+@interface NSNumber
++ (NSNumber *)numberWithChar:(char)value;
++ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
++ (NSNumber *)numberWithShort:(short)value;
++ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
++ (NSNumber *)numberWithInt:(int)value;
++ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
++ (NSNumber *)numberWithLong:(long)value;
++ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
++ (NSNumber *)numberWithLongLong:(long long)value;
++ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
++ (NSNumber *)numberWithFloat:(float)value;
++ (NSNumber *)numberWithDouble:(double)value;
++ (NSNumber *)numberWithBool:(BOOL)value;
++ (NSNumber *)numberWithInteger:(NSInteger)value ;
++ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value ;
+@end
+
+@interface NSString
++ (id)stringWithUTF8String:(const char *)str;
+@end
+
+int main(int argc, const char *argv[]) {
+ // character.
+ NSNumber *theLetterZ = @('Z'); // equivalent to [NSNumber numberWithChar:('Z')]
+
+ // integral.
+ NSNumber *fortyTwo = @(42); // equivalent to [NSNumber numberWithInt:(42)]
+ NSNumber *fortyTwoUnsigned = @(42U); // equivalent to [NSNumber numberWithUnsignedInt:(42U)]
+ NSNumber *fortyTwoLong = @(42L); // equivalent to [NSNumber numberWithLong:(42L)]
+ NSNumber *fortyTwoLongLong = @(42LL); // equivalent to [NSNumber numberWithLongLong:(42LL)]
+
+ // floating point.
+ NSNumber *piFloat = @(3.141592654F); // equivalent to [NSNumber numberWithFloat:(3.141592654F)]
+ NSNumber *piDouble = @(3.1415926535); // equivalent to [NSNumber numberWithDouble:(3.1415926535)]
+
+ // Strings.
+ NSString *duplicateString = @(strdup("Hello"));
+}
+
+// CHECK: NSNumber *theLetterZ = ((NSNumber *(*)(id, SEL, char))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithChar:"), ('Z'));
+// CHECK: NSNumber *fortyTwo = ((NSNumber *(*)(id, SEL, int))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithInt:"), (42));
+// CHECK: NSNumber *fortyTwoUnsigned = ((NSNumber *(*)(id, SEL, unsigned int))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithUnsignedInt:"), (42U));
+// CHECK: NSNumber *fortyTwoLong = ((NSNumber *(*)(id, SEL, long))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithLong:"), (42L));
+// CHECK: NSNumber *fortyTwoLongLong = ((NSNumber *(*)(id, SEL, long long))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithLongLong:"), (42LL));
+// CHECK: NSNumber *piFloat = ((NSNumber *(*)(id, SEL, float))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithFloat:"), (3.1415927));
+// CHECK: NSNumber *piDouble = ((NSNumber *(*)(id, SEL, double))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithDouble:"), (3.1415926535));
+// CHECK: NSString *duplicateString = ((NSString *(*)(id, SEL, const char *))(void *)objc_msgSend)(objc_getClass("NSString"), sel_registerName("stringWithUTF8String:"), (const char *)(strdup("Hello")));
diff --git a/clang/test/SemaObjC/boxing-illegal-types.m b/clang/test/SemaObjC/boxing-illegal-types.m
new file mode 100644
index 00000000000..dcfcee81606
--- /dev/null
+++ b/clang/test/SemaObjC/boxing-illegal-types.m
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -Wattributes %s
+
+typedef struct {
+ int x, y, z;
+} point;
+
+void testStruct() {
+ point p = { 0, 0, 0 };
+ id boxed = @(p); // expected-error {{Illegal type 'point' used in a boxed expression}}
+}
+
+void testPointers() {
+ void *null = 0;
+ id boxed_null = @(null); // expected-error {{Illegal type 'void *' used in a boxed expression}}
+ int numbers[] = { 0, 1, 2 };
+ id boxed_numbers = @(numbers); // expected-error {{Illegal type 'int *' used in a boxed expression}}
+}
diff --git a/clang/test/SemaTemplate/instantiate-objc-1.mm b/clang/test/SemaTemplate/instantiate-objc-1.mm
index 2780f8e5797..1a1a86885d6 100644
--- a/clang/test/SemaTemplate/instantiate-objc-1.mm
+++ b/clang/test/SemaTemplate/instantiate-objc-1.mm
@@ -46,3 +46,24 @@ template <typename T> struct EncodeTest {
template struct EncodeTest<int>;
template struct EncodeTest<double>;
template struct EncodeTest<wchar_t>;
+
+// @() boxing expressions.
+template <typename T> struct BoxingTest {
+ static id box(T value) {
+ return @(value); // expected-error {{Illegal type 'int *' used in a boxed expression}} \
+ // expected-error {{Illegal type 'long double' used in a boxed expression}}
+ }
+};
+
+@interface NSNumber
++ (NSNumber *)numberWithInt:(int)value;
+@end
+
+@interface NSString
++ (id)stringWithUTF8String:(const char *)str;
+@end
+
+template struct BoxingTest<int>;
+template struct BoxingTest<const char *>;
+template struct BoxingTest<int *>; // expected-note {{in instantiation of member function 'BoxingTest<int *>::box' requested here}}
+template struct BoxingTest<long double>; // expected-note {{in instantiation of member function 'BoxingTest<long double>::box' requested here}}
OpenPOWER on IntegriCloud