From 40efc0feb416e0b24848ed077c23dd4ca29c601f Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 8 Sep 2010 20:08:18 +0000 Subject: [PATCH] Fix a crash when overloading id with objc_object*. Radar 8400356. llvm-svn: 113397 --- clang/include/clang/AST/Type.h | 2 ++ clang/lib/AST/Type.cpp | 18 ++++++++++++++++++ clang/lib/Sema/SemaType.cpp | 6 +++++- clang/test/SemaObjC/legacy-objc-types.m | 20 ++++++++++++++++++++ clang/test/SemaObjCXX/legacy-objc-types.mm | 20 ++++++++++++++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaObjC/legacy-objc-types.m create mode 100644 clang/test/SemaObjCXX/legacy-objc-types.mm diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 92e62a58d42c..e643843a20dc 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -932,7 +932,9 @@ public: bool isObjCQualifiedClassType() const; // Class 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 diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 8e6aa23618c5..114c9ac7df9f 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -470,6 +470,24 @@ bool Type::isIntegralOrEnumerationType() const { return false; } +bool Type::isLegacyObjCIdType(ASTContext &Ctx) const { + if (const PointerType *PTTo = getAs()) { + QualType PointeeTy = PTTo->getPointeeType(); + if (const RecordType *RTy = PointeeTy->getAs()) + return RTy->getDecl()->getIdentifier() == &Ctx.Idents.get("objc_object"); + } + return false; +} + +bool Type::isLegacyObjCClassType(ASTContext &Ctx) const { + if (const PointerType *PTTo = getAs()) { + QualType PointeeTy = PTTo->getPointeeType(); + if (const RecordType *RTy = PointeeTy->getAs()) + return RTy->getDecl()->getIdentifier() == &Ctx.Idents.get("objc_class"); + } + return false; +} + bool Type::isEnumeralType() const { if (const TagType *TT = dyn_cast(CanonicalType)) return TT->getDecl()->isEnum(); diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index aa30b5c2da30..06d8b3d4f6b8 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1274,8 +1274,12 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S, 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); } diff --git a/clang/test/SemaObjC/legacy-objc-types.m b/clang/test/SemaObjC/legacy-objc-types.m new file mode 100644 index 000000000000..dbe32e64a254 --- /dev/null +++ b/clang/test/SemaObjC/legacy-objc-types.m @@ -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); + diff --git a/clang/test/SemaObjCXX/legacy-objc-types.mm b/clang/test/SemaObjCXX/legacy-objc-types.mm new file mode 100644 index 000000000000..56ee97fca2bc --- /dev/null +++ b/clang/test/SemaObjCXX/legacy-objc-types.mm @@ -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); +