diff options
| author | John McCall <rjmccall@apple.com> | 2010-04-09 17:38:44 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2010-04-09 17:38:44 +0000 |
| commit | b29f78fb9eef3f0d1fa5fb5f1066bac7cf99a573 (patch) | |
| tree | c945169400e08623f26ac7393f9f70bd3fe16a2c /clang/lib/Sema/SemaTemplateInstantiate.cpp | |
| parent | 8a651c71161f47f4fec8ac6413f34d4ae81291ec (diff) | |
| download | bcm5719-llvm-b29f78fb9eef3f0d1fa5fb5f1066bac7cf99a573.tar.gz bcm5719-llvm-b29f78fb9eef3f0d1fa5fb5f1066bac7cf99a573.zip | |
Instantiate default argument expressions even if their associated parameter
type isn't dependent. Fixes rdar://problem/7838962.
llvm-svn: 100871
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiate.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index d21862b71e8..6895364abf3 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -959,6 +959,56 @@ QualType Sema::SubstType(QualType T, return Instantiator.TransformType(T); } +static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T) { + if (T->getType()->isDependentType()) + return true; + + TypeLoc TL = T->getTypeLoc(); + if (!isa<FunctionProtoTypeLoc>(TL)) + return false; + + FunctionProtoTypeLoc FP = cast<FunctionProtoTypeLoc>(TL); + for (unsigned I = 0, E = FP.getNumArgs(); I != E; ++I) { + ParmVarDecl *P = FP.getArg(I); + + // TODO: currently we always rebuild expressions. When we + // properly get lazier about this, we should use the same + // logic to avoid rebuilding prototypes here. + if (P->hasInit()) + return true; + } + + return false; +} + +/// A form of SubstType intended specifically for instantiating the +/// type of a FunctionDecl. Its purpose is solely to force the +/// instantiation of default-argument expressions. +TypeSourceInfo *Sema::SubstFunctionDeclType(TypeSourceInfo *T, + const MultiLevelTemplateArgumentList &Args, + SourceLocation Loc, + DeclarationName Entity) { + assert(!ActiveTemplateInstantiations.empty() && + "Cannot perform an instantiation without some context on the " + "instantiation stack"); + + if (!NeedsInstantiationAsFunctionType(T)) + return T; + + TemplateInstantiator Instantiator(*this, Args, Loc, Entity); + + TypeLocBuilder TLB; + + TypeLoc TL = T->getTypeLoc(); + TLB.reserve(TL.getFullDataSize()); + + QualType Result = Instantiator.TransformType(TLB, TL, QualType()); + if (Result.isNull()) + return 0; + + return TLB.getTypeSourceInfo(Context, Result); +} + /// \brief Perform substitution on the base class specifiers of the /// given class template specialization. /// |

