From: Argyrios Kyrtzidis Date: Fri, 25 Jun 2010 09:03:34 +0000 (+0000) Subject: Support UnresolvedLookupExpr for PCH. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bd65bb511c26549c96b829c1282e4c877588564a;p=clang Support UnresolvedLookupExpr for PCH. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106832 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ExprCXX.h b/include/clang/AST/ExprCXX.h index 48248d322b..d9058ac326 100644 --- a/include/clang/AST/ExprCXX.h +++ b/include/clang/AST/ExprCXX.h @@ -1497,6 +1497,11 @@ class UnresolvedLookupExpr : public OverloadExpr { RequiresADL(RequiresADL), Overloaded(Overloaded), NamingClass(NamingClass) {} + UnresolvedLookupExpr(EmptyShell Empty) + : OverloadExpr(UnresolvedLookupExprClass, Empty), + RequiresADL(false), Overloaded(false), NamingClass(0) + {} + public: static UnresolvedLookupExpr *Create(ASTContext &C, bool Dependent, @@ -1528,17 +1533,23 @@ public: UnresolvedSetIterator Begin, UnresolvedSetIterator End); + static UnresolvedLookupExpr *CreateEmpty(ASTContext &C, + unsigned NumTemplateArgs); + /// True if this declaration should be extended by /// argument-dependent lookup. bool requiresADL() const { return RequiresADL; } + void setRequiresADL(bool V) { RequiresADL = V; } /// True if this lookup is overloaded. bool isOverloaded() const { return Overloaded; } + void setOverloaded(bool V) { Overloaded = V; } /// Gets the 'naming class' (in the sense of C++0x /// [class.access.base]p5) of the lookup. This is the scope /// that was looked in to find these results. CXXRecordDecl *getNamingClass() const { return NamingClass; } + void setNamingClass(CXXRecordDecl *D) { NamingClass = D; } // Note that, inconsistently with the explicit-template-argument AST // nodes, users are *forbidden* from calling these methods on objects diff --git a/include/clang/Frontend/PCHBitCodes.h b/include/clang/Frontend/PCHBitCodes.h index eda0fa12c6..fb7da7713d 100644 --- a/include/clang/Frontend/PCHBitCodes.h +++ b/include/clang/Frontend/PCHBitCodes.h @@ -771,7 +771,8 @@ namespace clang { EXPR_CXX_DEPENDENT_SCOPE_MEMBER, // CXXDependentScopeMemberExpr EXPR_CXX_UNRESOLVED_CONSTRUCT, // CXXUnresolvedConstructExpr - EXPR_CXX_UNRESOLVED_MEMBER // UnresolvedMemberExpr + EXPR_CXX_UNRESOLVED_MEMBER, // UnresolvedMemberExpr + EXPR_CXX_UNRESOLVED_LOOKUP // UnresolvedLookupExpr }; /// \brief The kinds of designators that can occur in a diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index 14506690e8..b31c448ff0 100644 --- a/lib/AST/ExprCXX.cpp +++ b/lib/AST/ExprCXX.cpp @@ -190,6 +190,18 @@ UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent, return ULE; } +UnresolvedLookupExpr * +UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) { + std::size_t size = sizeof(UnresolvedLookupExpr); + if (NumTemplateArgs != 0) + size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); + + void *Mem = C.Allocate(size, llvm::alignof()); + UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell()); + E->HasExplicitTemplateArgs = NumTemplateArgs != 0; + return E; +} + OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, QualType T, bool Dependent, NestedNameSpecifier *Qualifier, SourceRange QRange, DeclarationName Name, diff --git a/lib/Frontend/PCHReaderStmt.cpp b/lib/Frontend/PCHReaderStmt.cpp index d12f3ea4e9..fa2a4513d1 100644 --- a/lib/Frontend/PCHReaderStmt.cpp +++ b/lib/Frontend/PCHReaderStmt.cpp @@ -143,6 +143,7 @@ namespace { unsigned VisitOverloadExpr(OverloadExpr *E); unsigned VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E); + unsigned VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E); }; } @@ -1205,6 +1206,14 @@ unsigned PCHStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { return 1; } +unsigned PCHStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { + VisitOverloadExpr(E); + E->setRequiresADL(Record[Idx++]); + E->setOverloaded(Record[Idx++]); + E->setNamingClass(cast_or_null(Reader.GetDecl(Record[Idx++]))); + return 0; +} + // Within the bitstream, expressions are stored in Reverse Polish // Notation, with each of the subexpressions preceding the @@ -1602,6 +1611,11 @@ Stmt *PCHReader::ReadStmt(llvm::BitstreamCursor &Cursor) { S = UnresolvedMemberExpr::CreateEmpty(*Context, /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]); break; + + case pch::EXPR_CXX_UNRESOLVED_LOOKUP: + S = UnresolvedLookupExpr::CreateEmpty(*Context, + /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]); + break; } // We hit a STMT_STOP, so we're done with this expression. diff --git a/lib/Frontend/PCHWriterStmt.cpp b/lib/Frontend/PCHWriterStmt.cpp index ffddad6754..ef109c34f1 100644 --- a/lib/Frontend/PCHWriterStmt.cpp +++ b/lib/Frontend/PCHWriterStmt.cpp @@ -138,6 +138,7 @@ namespace { void VisitOverloadExpr(OverloadExpr *E); void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E); + void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E); }; } @@ -1108,6 +1109,14 @@ void PCHStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { Code = pch::EXPR_CXX_UNRESOLVED_MEMBER; } +void PCHStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { + VisitOverloadExpr(E); + Record.push_back(E->requiresADL()); + Record.push_back(E->isOverloaded()); + Writer.AddDeclRef(E->getNamingClass(), Record); + Code = pch::EXPR_CXX_UNRESOLVED_LOOKUP; +} + //===----------------------------------------------------------------------===// // PCHWriter Implementation //===----------------------------------------------------------------------===// diff --git a/test/PCH/cxx-templates.h b/test/PCH/cxx-templates.h index 945197b923..b17b355db5 100644 --- a/test/PCH/cxx-templates.h +++ b/test/PCH/cxx-templates.h @@ -20,6 +20,16 @@ T templ_f(T x) { return x; } +void govl(int); +void govl(char); + +template +struct Unresolv { + void f() { + govl(T()); + } +}; + template struct Dep { typedef typename T::type Ty;