[cfe-commits] r104991 - in /cfe/trunk: lib/Sema/Sema.cpp lib/Sema/Sema.h lib/Sema/SemaLookup.cpp test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp

Douglas Gregor dgregor at apple.com
Fri May 28 13:11:43 PDT 2010


Thanks!

On May 28, 2010, at 11:45 AM, John McCall wrote:

> Author: rjmccall
> Date: Fri May 28 13:45:08 2010
> New Revision: 104991
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=104991&view=rev
> Log:
> A more minimal fix for PR6762.
> 
> 
> Modified:
>    cfe/trunk/lib/Sema/Sema.cpp
>    cfe/trunk/lib/Sema/Sema.h
>    cfe/trunk/lib/Sema/SemaLookup.cpp
>    cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp
> 
> Modified: cfe/trunk/lib/Sema/Sema.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=104991&r1=104990&r2=104991&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/Sema.cpp (original)
> +++ cfe/trunk/lib/Sema/Sema.cpp Fri May 28 13:45:08 2010
> @@ -43,6 +43,8 @@
>   TUScope = S;
>   PushDeclContext(S, Context.getTranslationUnitDecl());
> 
> +  VAListTagName = PP.getIdentifierInfo("__va_list_tag");
> +
>   if (PP.getTargetInfo().getPointerWidth(0) >= 64) {
>     TypeSourceInfo *TInfo;
> 
> 
> Modified: cfe/trunk/lib/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=104991&r1=104990&r2=104991&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/Sema.h (original)
> +++ cfe/trunk/lib/Sema/Sema.h Fri May 28 13:45:08 2010
> @@ -239,6 +239,10 @@
>   /// CurContext - This is the current declaration context of parsing.
>   DeclContext *CurContext;
> 
> +  /// VAListTagName - The declaration name corresponding to __va_list_tag.
> +  /// This is used as part of a hack to omit that class from ADL results.
> +  DeclarationName VAListTagName;
> +
>   /// A RAII object to temporarily push a declaration context.
>   class ContextRAII {
>   private:
> 
> Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=104991&r1=104990&r2=104991&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaLookup.cpp Fri May 28 13:45:08 2010
> @@ -1416,11 +1416,22 @@
>   return true;
> }
> 
> +namespace {
> +  struct AssociatedLookup {
> +    AssociatedLookup(Sema &S,
> +                     Sema::AssociatedNamespaceSet &Namespaces,
> +                     Sema::AssociatedClassSet &Classes)
> +      : S(S), Namespaces(Namespaces), Classes(Classes) {
> +    }
> +
> +    Sema &S;
> +    Sema::AssociatedNamespaceSet &Namespaces;
> +    Sema::AssociatedClassSet &Classes;
> +  };
> +}
> +
> static void
> -addAssociatedClassesAndNamespaces(QualType T,
> -                                  ASTContext &Context,
> -                          Sema::AssociatedNamespaceSet &AssociatedNamespaces,
> -                                  Sema::AssociatedClassSet &AssociatedClasses);
> +addAssociatedClassesAndNamespaces(AssociatedLookup &Result, QualType T);
> 
> static void CollectEnclosingNamespace(Sema::AssociatedNamespaceSet &Namespaces,
>                                       DeclContext *Ctx) {
> @@ -1439,10 +1450,8 @@
> // \brief Add the associated classes and namespaces for argument-dependent
> // lookup that involves a template argument (C++ [basic.lookup.koenig]p2).
> static void
> -addAssociatedClassesAndNamespaces(const TemplateArgument &Arg,
> -                                  ASTContext &Context,
> -                           Sema::AssociatedNamespaceSet &AssociatedNamespaces,
> -                                  Sema::AssociatedClassSet &AssociatedClasses) {
> +addAssociatedClassesAndNamespaces(AssociatedLookup &Result,
> +                                  const TemplateArgument &Arg) {
>   // C++ [basic.lookup.koenig]p2, last bullet:
>   //   -- [...] ;
>   switch (Arg.getKind()) {
> @@ -1453,9 +1462,7 @@
>       // [...] the namespaces and classes associated with the types of the
>       // template arguments provided for template type parameters (excluding
>       // template template parameters)
> -      addAssociatedClassesAndNamespaces(Arg.getAsType(), Context,
> -                                        AssociatedNamespaces,
> -                                        AssociatedClasses);
> +      addAssociatedClassesAndNamespaces(Result, Arg.getAsType());
>       break;
> 
>     case TemplateArgument::Template: {
> @@ -1467,9 +1474,9 @@
>                  = dyn_cast<ClassTemplateDecl>(Template.getAsTemplateDecl())) {
>         DeclContext *Ctx = ClassTemplate->getDeclContext();
>         if (CXXRecordDecl *EnclosingClass = dyn_cast<CXXRecordDecl>(Ctx))
> -          AssociatedClasses.insert(EnclosingClass);
> +          Result.Classes.insert(EnclosingClass);
>         // Add the associated namespace for this class.
> -        CollectEnclosingNamespace(AssociatedNamespaces, Ctx);
> +        CollectEnclosingNamespace(Result.Namespaces, Ctx);
>       }
>       break;
>     }
> @@ -1485,9 +1492,7 @@
>       for (TemplateArgument::pack_iterator P = Arg.pack_begin(),
>                                         PEnd = Arg.pack_end();
>            P != PEnd; ++P)
> -        addAssociatedClassesAndNamespaces(*P, Context,
> -                                          AssociatedNamespaces,
> -                                          AssociatedClasses);
> +        addAssociatedClassesAndNamespaces(Result, *P);
>       break;
>   }
> }
> @@ -1496,10 +1501,13 @@
> // argument-dependent lookup with an argument of class type
> // (C++ [basic.lookup.koenig]p2).
> static void
> -addAssociatedClassesAndNamespaces(CXXRecordDecl *Class,
> -                                  ASTContext &Context,
> -                            Sema::AssociatedNamespaceSet &AssociatedNamespaces,
> -                            Sema::AssociatedClassSet &AssociatedClasses) {
> +addAssociatedClassesAndNamespaces(AssociatedLookup &Result,
> +                                  CXXRecordDecl *Class) {
> +
> +  // Just silently ignore anything whose name is __va_list_tag.
> +  if (Class->getDeclName() == Result.S.VAListTagName)
> +    return;
> +
>   // C++ [basic.lookup.koenig]p2:
>   //   [...]
>   //     -- If T is a class type (including unions), its associated
> @@ -1511,13 +1519,13 @@
>   // Add the class of which it is a member, if any.
>   DeclContext *Ctx = Class->getDeclContext();
>   if (CXXRecordDecl *EnclosingClass = dyn_cast<CXXRecordDecl>(Ctx))
> -    AssociatedClasses.insert(EnclosingClass);
> +    Result.Classes.insert(EnclosingClass);
>   // Add the associated namespace for this class.
> -  CollectEnclosingNamespace(AssociatedNamespaces, Ctx);
> +  CollectEnclosingNamespace(Result.Namespaces, Ctx);
> 
>   // Add the class itself. If we've already seen this class, we don't
>   // need to visit base classes.
> -  if (!AssociatedClasses.insert(Class))
> +  if (!Result.Classes.insert(Class))
>     return;
> 
>   // -- If T is a template-id, its associated namespaces and classes are
> @@ -1533,15 +1541,13 @@
>         = dyn_cast<ClassTemplateSpecializationDecl>(Class)) {
>     DeclContext *Ctx = Spec->getSpecializedTemplate()->getDeclContext();
>     if (CXXRecordDecl *EnclosingClass = dyn_cast<CXXRecordDecl>(Ctx))
> -      AssociatedClasses.insert(EnclosingClass);
> +      Result.Classes.insert(EnclosingClass);
>     // Add the associated namespace for this class.
> -    CollectEnclosingNamespace(AssociatedNamespaces, Ctx);
> +    CollectEnclosingNamespace(Result.Namespaces, Ctx);
> 
>     const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
>     for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
> -      addAssociatedClassesAndNamespaces(TemplateArgs[I], Context,
> -                                        AssociatedNamespaces,
> -                                        AssociatedClasses);
> +      addAssociatedClassesAndNamespaces(Result, TemplateArgs[I]);
>   }
> 
>   // Only recurse into base classes for complete types.
> @@ -1573,10 +1579,10 @@
>       if (!BaseType)
>         continue;
>       CXXRecordDecl *BaseDecl = cast<CXXRecordDecl>(BaseType->getDecl());
> -      if (AssociatedClasses.insert(BaseDecl)) {
> +      if (Result.Classes.insert(BaseDecl)) {
>         // Find the associated namespace for this base class.
>         DeclContext *BaseCtx = BaseDecl->getDeclContext();
> -        CollectEnclosingNamespace(AssociatedNamespaces, BaseCtx);
> +        CollectEnclosingNamespace(Result.Namespaces, BaseCtx);
> 
>         // Make sure we visit the bases of this base class.
>         if (BaseDecl->bases_begin() != BaseDecl->bases_end())
> @@ -1590,10 +1596,7 @@
> // argument-dependent lookup with an argument of type T
> // (C++ [basic.lookup.koenig]p2).
> static void
> -addAssociatedClassesAndNamespaces(QualType Ty,
> -                                  ASTContext &Context,
> -                            Sema::AssociatedNamespaceSet &AssociatedNamespaces,
> -                                  Sema::AssociatedClassSet &AssociatedClasses) {
> +addAssociatedClassesAndNamespaces(AssociatedLookup &Result, QualType Ty) {
>   // C++ [basic.lookup.koenig]p2:
>   //
>   //   For each argument type T in the function call, there is a set
> @@ -1648,9 +1651,7 @@
>     case Type::Record: {
>       CXXRecordDecl *Class
>         = cast<CXXRecordDecl>(cast<RecordType>(T)->getDecl());
> -      addAssociatedClassesAndNamespaces(Class, Context,
> -                                        AssociatedNamespaces,
> -                                        AssociatedClasses);
> +      addAssociatedClassesAndNamespaces(Result, Class);
>       break;
>     }
> 
> @@ -1663,10 +1664,10 @@
> 
>       DeclContext *Ctx = Enum->getDeclContext();
>       if (CXXRecordDecl *EnclosingClass = dyn_cast<CXXRecordDecl>(Ctx))
> -        AssociatedClasses.insert(EnclosingClass);
> +        Result.Classes.insert(EnclosingClass);
> 
>       // Add the associated namespace for this class.
> -      CollectEnclosingNamespace(AssociatedNamespaces, Ctx);
> +      CollectEnclosingNamespace(Result.Namespaces, Ctx);
> 
>       break;
>     }
> @@ -1753,6 +1754,8 @@
>   AssociatedNamespaces.clear();
>   AssociatedClasses.clear();
> 
> +  AssociatedLookup Result(*this, AssociatedNamespaces, AssociatedClasses);
> +
>   // C++ [basic.lookup.koenig]p2:
>   //   For each argument type T in the function call, there is a set
>   //   of zero or more associated namespaces and a set of zero or more
> @@ -1764,9 +1767,7 @@
>     Expr *Arg = Args[ArgIdx];
> 
>     if (Arg->getType() != Context.OverloadTy) {
> -      addAssociatedClassesAndNamespaces(Arg->getType(), Context,
> -                                        AssociatedNamespaces,
> -                                        AssociatedClasses);
> +      addAssociatedClassesAndNamespaces(Result, Arg->getType());
>       continue;
>     }
> 
> @@ -1782,17 +1783,11 @@
>       if (unaryOp->getOpcode() == UnaryOperator::AddrOf)
>         Arg = unaryOp->getSubExpr();
> 
> -    // TODO: avoid the copies.  This should be easy when the cases
> -    // share a storage implementation.
> -    llvm::SmallVector<NamedDecl*, 8> Functions;
> -
> -    if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Arg))
> -      Functions.append(ULE->decls_begin(), ULE->decls_end());
> -    else
> -      continue;
> +    UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Arg);
> +    if (!ULE) continue;
> 
> -    for (llvm::SmallVectorImpl<NamedDecl*>::iterator I = Functions.begin(),
> -           E = Functions.end(); I != E; ++I) {
> +    for (UnresolvedSetIterator I = ULE->decls_begin(), E = ULE->decls_end();
> +           I != E; ++I) {
>       // Look through any using declarations to find the underlying function.
>       NamedDecl *Fn = (*I)->getUnderlyingDecl();
> 
> @@ -1802,9 +1797,7 @@
> 
>       // Add the classes and namespaces associated with the parameter
>       // types and return type of this function.
> -      addAssociatedClassesAndNamespaces(FDecl->getType(), Context,
> -                                        AssociatedNamespaces,
> -                                        AssociatedClasses);
> +      addAssociatedClassesAndNamespaces(Result, FDecl->getType());
>     }
>   }
> }
> 
> Modified: cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp?rev=104991&r1=104990&r2=104991&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp (original)
> +++ cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp Fri May 28 13:45:08 2010
> @@ -97,3 +97,14 @@
>     foo(&bar);
>   }
> }
> +
> +// PR6762: __builtin_va_list should be invisible to ADL on all platforms.
> +void test6_function(__builtin_va_list &argv);
> +namespace test6 {
> +  void test6_function(__builtin_va_list &argv);
> +
> +  void test() {
> +    __builtin_va_list args;
> +    test6_function(args);
> +  }
> +}
> 
> 
> _______________________________________________
> 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