On May 24, 2012, at 3:17 AM, Erik Verbruggen <[email protected]> wrote: > Quite errr... surprising. I only understood the testcase after reading it > like 3 times. I think we should add a warning for this (possibly off by > default), because I can see a lot of people falling into this trap.
I'd be happy to add a warning, if only I could figure out why anyone would ever want to do this. - Doug > -- Erik > > On 18 mei 2012, at 01:13, Douglas Gregor <[email protected]> wrote: > >> Author: dgregor >> Date: Thu May 17 18:13:29 2012 >> New Revision: 157025 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=157025&view=rev >> Log: >> A selector match between two Objective-C methods does *not* guarantee >> that the methods have the same number of parameters, although we >> certainly assumed this in many places. Objective-C can be insane >> sometimes. Fixes <rdar://problem/11460990>. >> >> Modified: >> cfe/trunk/lib/Sema/SemaDecl.cpp >> cfe/trunk/lib/Sema/SemaDeclObjC.cpp >> cfe/trunk/test/SemaObjC/related-result-type-inference.m >> >> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=157025&r1=157024&r2=157025&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu May 17 18:13:29 2012 >> @@ -2227,10 +2227,11 @@ >> mergeDeclAttributes(newMethod, oldMethod, mergeDeprecation); >> >> // Merge attributes from the parameters. >> - ObjCMethodDecl::param_const_iterator oi = oldMethod->param_begin(); >> + ObjCMethodDecl::param_const_iterator oi = oldMethod->param_begin(), >> + oe = oldMethod->param_end(); >> for (ObjCMethodDecl::param_iterator >> ni = newMethod->param_begin(), ne = newMethod->param_end(); >> - ni != ne; ++ni, ++oi) >> + ni != ne && oi != oe; ++ni, ++oi) >> mergeParamDeclAttributes(*ni, *oi, Context); >> >> CheckObjCMethodOverride(newMethod, oldMethod, true); >> >> Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=157025&r1=157024&r2=157025&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Thu May 17 18:13:29 2012 >> @@ -173,10 +173,11 @@ >> Diag(Overridden->getLocation(), diag::note_previous_decl) >> << "method"; >> } >> - ObjCMethodDecl::param_const_iterator oi = Overridden->param_begin(); >> + ObjCMethodDecl::param_const_iterator oi = Overridden->param_begin(), >> + oe = Overridden->param_end(); >> for (ObjCMethodDecl::param_iterator >> ni = NewMethod->param_begin(), ne = NewMethod->param_end(); >> - ni != ne; ++ni, ++oi) { >> + ni != ne && oi != oe; ++ni, ++oi) { >> const ParmVarDecl *oldDecl = (*oi); >> ParmVarDecl *newDecl = (*ni); >> if (newDecl->hasAttr<NSConsumedAttr>() != >> @@ -1399,8 +1400,9 @@ >> true); >> >> for (ObjCMethodDecl::param_iterator IM = ImpMethodDecl->param_begin(), >> - IF = MethodDecl->param_begin(), EM = ImpMethodDecl->param_end(); >> - IM != EM; ++IM, ++IF) { >> + IF = MethodDecl->param_begin(), EM = ImpMethodDecl->param_end(), >> + EF = MethodDecl->param_end(); >> + IM != EM && IF != EF; ++IM, ++IF) { >> CheckMethodOverrideParam(*this, ImpMethodDecl, MethodDecl, *IM, *IF, >> IsProtocolMethodDecl, false, true); >> } >> @@ -1421,8 +1423,9 @@ >> true); >> >> for (ObjCMethodDecl::param_iterator IM = Method->param_begin(), >> - IF = Overridden->param_begin(), EM = Method->param_end(); >> - IM != EM; ++IM, ++IF) { >> + IF = Overridden->param_begin(), EM = Method->param_end(), >> + EF = Overridden->param_end(); >> + IM != EM && IF != EF; ++IM, ++IF) { >> CheckMethodOverrideParam(*this, Method, Overridden, *IM, *IF, >> IsProtocolMethodDecl, true, true); >> } >> @@ -1454,8 +1457,9 @@ >> IsProtocolMethodDecl, false, false); >> if (match) >> for (ObjCMethodDecl::param_iterator IM = ImpMethodDecl->param_begin(), >> - IF = MethodDecl->param_begin(), EM = ImpMethodDecl->param_end(); >> - IM != EM; ++IM, ++IF) { >> + IF = MethodDecl->param_begin(), EM = ImpMethodDecl->param_end(), >> + EF = MethodDecl->param_end(); >> + IM != EM && IF != EF; ++IM, ++IF) { >> match = CheckMethodOverrideParam(*this, ImpMethodDecl, MethodDecl, >> *IM, *IF, >> IsProtocolMethodDecl, false, false); >> @@ -1954,9 +1958,10 @@ >> return false; >> >> ObjCMethodDecl::param_const_iterator >> - li = left->param_begin(), le = left->param_end(), ri = >> right->param_begin(); >> + li = left->param_begin(), le = left->param_end(), ri = >> right->param_begin(), >> + re = right->param_end(); >> >> - for (; li != le; ++li, ++ri) { >> + for (; li != le && ri != re; ++li, ++ri) { >> assert(ri != right->param_end() && "Param mismatch"); >> const ParmVarDecl *lparm = *li, *rparm = *ri; >> >> @@ -2673,9 +2678,9 @@ >> isa<ObjCInterfaceDecl>(overridden->getDeclContext())) { >> ObjCMethodDecl::param_iterator ParamI = ObjCMethod->param_begin(), >> E = ObjCMethod->param_end(); >> - ObjCMethodDecl::param_iterator PrevI = overridden->param_begin(); >> - for (; ParamI != E; ++ParamI, ++PrevI) { >> - // Number of parameters are the same and is guaranteed by selector >> match. >> + ObjCMethodDecl::param_iterator PrevI = overridden->param_begin(), >> + PrevE = overridden->param_end(); >> + for (; ParamI != E && PrevI != PrevE; ++ParamI, ++PrevI) { >> assert(PrevI != overridden->param_end() && "Param mismatch"); >> QualType T1 = Context.getCanonicalType((*ParamI)->getType()); >> QualType T2 = Context.getCanonicalType((*PrevI)->getType()); >> >> Modified: cfe/trunk/test/SemaObjC/related-result-type-inference.m >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/related-result-type-inference.m?rev=157025&r1=157024&r2=157025&view=diff >> ============================================================================== >> --- cfe/trunk/test/SemaObjC/related-result-type-inference.m (original) >> +++ cfe/trunk/test/SemaObjC/related-result-type-inference.m Thu May 17 >> 18:13:29 2012 >> @@ -178,3 +178,9 @@ >> return (id)self; // expected-warning {{returning 'Fail *' from a function >> with incompatible result type 'id<X>'}} >> } >> @end >> + >> +// <rdar://problem/11460990> >> + >> +@interface WeirdNSString : NSString >> +- (id)initWithCString:(const char*)string, void *blah; >> +@end >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
