[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