Predefine all the ObjC goodies from <objc/objc.h>. Removed all the ObjC goodies from the respective test files. Moving forward, it will be very nice to assume these builtin!


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43077 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Lex/Preprocessor.cpp b/Lex/Preprocessor.cpp
index 78e4496..c1f14a9 100644
--- a/Lex/Preprocessor.cpp
+++ b/Lex/Preprocessor.cpp
@@ -371,9 +371,27 @@
     DefineBuiltinMacro(Buf, "__OBJC2__=1");
 
   if (PP.getLangOptions().ObjC1) {
-    // FIXME: make this the right thing.
-    const char *IDTypedef = "/*typedef int id;*/\n";
-    Buf.insert(Buf.end(), IDTypedef, IDTypedef+strlen(IDTypedef));
+    // Predefine all the ObjC goodies (traditionally declared in <objc/objc.h>).
+    // We define the following header guard for source compatibility. It has
+    // the effect of ignoring any explicit inclusion of <objc/objc.h>:-)
+    DefineBuiltinMacro(Buf, "_OBJC_OBJC_H_=1");
+    DefineBuiltinMacro(Buf, "OBJC_EXPORT=extern");
+    DefineBuiltinMacro(Buf, "OBJC_IMPORT=extern");
+    const char *ObjcType;
+    ObjcType = "typedef struct objc_class *Class;\n";
+    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
+    ObjcType = "typedef struct objc_object { Class isa; } *id;\n";
+    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
+    ObjcType = "typedef struct objc_selector *SEL;\n";
+    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
+    ObjcType = "typedef id (*IMP)(id, SEL, ...);\n";
+    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
+    ObjcType = "typedef signed char BOOL;\n";
+    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
+    DefineBuiltinMacro(Buf, "YES=(BOOL)1");
+    DefineBuiltinMacro(Buf, "NO=(BOOL)0");
+    DefineBuiltinMacro(Buf, "Nil=0");
+    DefineBuiltinMacro(Buf, "nil=0");
   }
 
   // Add __builtin_va_list typedef.