[cfe-commits] r113397 - in /cfe/trunk: include/clang/AST/Type.h lib/AST/Type.cpp lib/Sema/SemaType.cpp test/SemaObjC/legacy-objc-types.m test/SemaObjCXX/legacy-objc-types.mm

Fariborz Jahanian fjahanian at apple.com
Wed Sep 8 13:08:18 PDT 2010


Author: fjahanian
Date: Wed Sep  8 15:08:18 2010
New Revision: 113397

URL: http://llvm.org/viewvc/llvm-project?rev=113397&view=rev
Log:
Fix a crash when overloading id with objc_object*.
Radar 8400356.


Added:
    cfe/trunk/test/SemaObjC/legacy-objc-types.m
    cfe/trunk/test/SemaObjCXX/legacy-objc-types.mm
Modified:
    cfe/trunk/include/clang/AST/Type.h
    cfe/trunk/lib/AST/Type.cpp
    cfe/trunk/lib/Sema/SemaType.cpp

Modified: cfe/trunk/include/clang/AST/Type.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=113397&r1=113396&r2=113397&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Type.h (original)
+++ cfe/trunk/include/clang/AST/Type.h Wed Sep  8 15:08:18 2010
@@ -932,7 +932,9 @@
   bool isObjCQualifiedClassType() const;        // Class<foo>
   bool isObjCObjectOrInterfaceType() const;
   bool isObjCIdType() const;                    // id
+  bool isLegacyObjCIdType(ASTContext &) const;  // struct_object *
   bool isObjCClassType() const;                 // Class
+  bool isLegacyObjCClassType(ASTContext &) const; // struct_class *
   bool isObjCSelType() const;                 // Class
   bool isObjCBuiltinType() const;               // 'id' or 'Class'
   bool isTemplateTypeParmType() const;          // C++ template type parameter

Modified: cfe/trunk/lib/AST/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=113397&r1=113396&r2=113397&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Type.cpp (original)
+++ cfe/trunk/lib/AST/Type.cpp Wed Sep  8 15:08:18 2010
@@ -470,6 +470,24 @@
   return false;  
 }
 
+bool Type::isLegacyObjCIdType(ASTContext &Ctx) const {
+  if (const PointerType *PTTo = getAs<PointerType>()) {
+    QualType PointeeTy = PTTo->getPointeeType();
+    if (const RecordType *RTy = PointeeTy->getAs<RecordType>())
+      return RTy->getDecl()->getIdentifier() == &Ctx.Idents.get("objc_object");
+  }
+  return false;
+}
+
+bool Type::isLegacyObjCClassType(ASTContext &Ctx) const {
+  if (const PointerType *PTTo = getAs<PointerType>()) {
+    QualType PointeeTy = PTTo->getPointeeType();
+    if (const RecordType *RTy = PointeeTy->getAs<RecordType>())
+      return RTy->getDecl()->getIdentifier() == &Ctx.Idents.get("objc_class");
+  }
+  return false;
+}
+
 bool Type::isEnumeralType() const {
   if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
     return TT->getDecl()->isEnum();

Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=113397&r1=113396&r2=113397&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Wed Sep  8 15:08:18 2010
@@ -1274,8 +1274,12 @@
               if (BTy->getKind() == BuiltinType::Float)
                 ArgTy = Context.DoubleTy;
             }
+          } else if (getLangOptions().ObjC1) {
+            if (ArgTy->isLegacyObjCIdType(Context))
+              ArgTy = Context.getObjCIdType();
+            else if (ArgTy->isLegacyObjCClassType(Context))
+              ArgTy = Context.getObjCClassType();
           }
-
           ArgTys.push_back(ArgTy);
         }
 

Added: cfe/trunk/test/SemaObjC/legacy-objc-types.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/legacy-objc-types.m?rev=113397&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjC/legacy-objc-types.m (added)
+++ cfe/trunk/test/SemaObjC/legacy-objc-types.m Wed Sep  8 15:08:18 2010
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// rdar:// 8400356
+
+struct objc_object;
+
+void f(id ptr) { } // expected-note {{previous definition is here}}
+void f(struct objc_object* ptr) { }	// expected-error {{redefinition of 'f'}}
+
+struct objc_class;
+
+void g(Class ptr) {} // expected-note {{previous definition is here}}
+void g(struct objc_class* ptr) { }	// expected-error {{redefinition of 'g'}}
+
+void h(Class ptr, struct objc_object* ptr1) {} // expected-note {{previous definition is here}}
+void h(struct objc_class* ptr, id ptr1) {}	// expected-error {{redefinition of 'h'}}
+
+void i(Class ptr, struct objc_object* ptr1);
+void i(struct objc_class* ptr, id ptr1) {}
+void i(struct objc_class* ptr, struct objc_object* ptr1);
+

Added: cfe/trunk/test/SemaObjCXX/legacy-objc-types.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/legacy-objc-types.mm?rev=113397&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjCXX/legacy-objc-types.mm (added)
+++ cfe/trunk/test/SemaObjCXX/legacy-objc-types.mm Wed Sep  8 15:08:18 2010
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// rdar:// 8400356
+
+struct objc_object;
+
+void f(id ptr) { } // expected-note {{previous definition is here}}
+void f(objc_object* ptr) { }	// expected-error {{redefinition of 'f'}}
+
+struct objc_class;
+
+void g(Class ptr) {} // expected-note {{previous definition is here}}
+void g(objc_class* ptr) { }	// expected-error {{redefinition of 'g'}}
+
+void h(Class ptr, objc_object* ptr1) {} // expected-note {{previous definition is here}}
+void h(objc_class* ptr, id ptr1) {}	// expected-error {{redefinition of 'h'}}
+
+void i(Class ptr, objc_object* ptr1);
+void i(objc_class* ptr, id ptr1) {}
+void i(objc_class* ptr, objc_object* ptr1);
+





More information about the cfe-commits mailing list