[cfe-commits] r157025 - in /cfe/trunk: lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclObjC.cpp test/SemaObjC/related-result-type-inference.m

Erik Verbruggen erikjv at me.com
Thu May 24 03:17:31 PDT 2012


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.

-- Erik

On 18 mei 2012, at 01:13, Douglas Gregor <dgregor at apple.com> 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>
> +
> + at interface WeirdNSString : NSString
> +- (id)initWithCString:(const char*)string, void *blah;
> + at end
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list