зеркало из https://github.com/microsoft/clang-1.git
Make sure that the template parameter lists get from the parser down to ActOnFunctionDeclarator for function template definitions
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74040 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
43f24e05ce
Коммит
52591bf224
|
@ -1465,6 +1465,14 @@ public:
|
|||
return DeclPtrTy();
|
||||
}
|
||||
|
||||
/// \brief Invoked when the parser is beginning to parse a function template
|
||||
/// or function template specialization definition.
|
||||
virtual DeclPtrTy ActOnStartOfFunctionTemplateDef(Scope *FnBodyScope,
|
||||
MultiTemplateParamsArg TemplateParameterLists,
|
||||
Declarator &D) {
|
||||
return DeclPtrTy();
|
||||
}
|
||||
|
||||
/// \brief Process the explicit instantiation of a class template
|
||||
/// specialization.
|
||||
///
|
||||
|
|
|
@ -636,7 +636,8 @@ private:
|
|||
DeclGroupPtrTy ParseDeclarationOrFunctionDefinition(
|
||||
AccessSpecifier AS = AS_none);
|
||||
|
||||
DeclPtrTy ParseFunctionDefinition(Declarator &D);
|
||||
DeclPtrTy ParseFunctionDefinition(Declarator &D,
|
||||
const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo());
|
||||
void ParseKNRParamDeclarations(Declarator &D);
|
||||
// EndLoc, if non-NULL, is filled with the location of the last token of
|
||||
// the simple-asm.
|
||||
|
|
|
@ -201,7 +201,7 @@ Parser::ParseSingleDeclarationAfterTemplate(
|
|||
}
|
||||
return DeclPtrTy();
|
||||
}
|
||||
return ParseFunctionDefinition(DeclaratorInfo);
|
||||
return ParseFunctionDefinition(DeclaratorInfo, TemplateInfo);
|
||||
}
|
||||
|
||||
if (DeclaratorInfo.isFunctionDeclarator())
|
||||
|
|
|
@ -590,7 +590,8 @@ Parser::ParseDeclarationOrFunctionDefinition(AccessSpecifier AS) {
|
|||
/// [C++] function-definition: [C++ 8.4]
|
||||
/// decl-specifier-seq[opt] declarator function-try-block
|
||||
///
|
||||
Parser::DeclPtrTy Parser::ParseFunctionDefinition(Declarator &D) {
|
||||
Parser::DeclPtrTy Parser::ParseFunctionDefinition(Declarator &D,
|
||||
const ParsedTemplateInfo &TemplateInfo) {
|
||||
const DeclaratorChunk &FnTypeInfo = D.getTypeObject(0);
|
||||
assert(FnTypeInfo.Kind == DeclaratorChunk::Function &&
|
||||
"This isn't a function declarator!");
|
||||
|
@ -632,7 +633,13 @@ Parser::DeclPtrTy Parser::ParseFunctionDefinition(Declarator &D) {
|
|||
|
||||
// Tell the actions module that we have entered a function definition with the
|
||||
// specified Declarator for the function.
|
||||
DeclPtrTy Res = Actions.ActOnStartOfFunctionDef(CurScope, D);
|
||||
DeclPtrTy Res = TemplateInfo.TemplateParams?
|
||||
Actions.ActOnStartOfFunctionTemplateDef(CurScope,
|
||||
Action::MultiTemplateParamsArg(Actions,
|
||||
TemplateInfo.TemplateParams->data(),
|
||||
TemplateInfo.TemplateParams->size()),
|
||||
D)
|
||||
: Actions.ActOnStartOfFunctionDef(CurScope, D);
|
||||
|
||||
if (Tok.is(tok::kw_try))
|
||||
return ParseFunctionTryBlock(Res);
|
||||
|
|
|
@ -2077,6 +2077,10 @@ public:
|
|||
MultiTemplateParamsArg TemplateParameterLists,
|
||||
Declarator &D);
|
||||
|
||||
virtual DeclPtrTy ActOnStartOfFunctionTemplateDef(Scope *FnBodyScope,
|
||||
MultiTemplateParamsArg TemplateParameterLists,
|
||||
Declarator &D);
|
||||
|
||||
virtual DeclResult
|
||||
ActOnExplicitInstantiation(Scope *S, SourceLocation TemplateLoc,
|
||||
unsigned TagSpec,
|
||||
|
|
|
@ -3037,6 +3037,8 @@ Sema::DeclPtrTy Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope,
|
|||
}
|
||||
|
||||
Sema::DeclPtrTy Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclPtrTy D) {
|
||||
if (!D)
|
||||
return D;
|
||||
FunctionDecl *FD = cast<FunctionDecl>(D.getAs<Decl>());
|
||||
|
||||
CurFunctionNeedsScopeChecking = false;
|
||||
|
|
|
@ -2507,6 +2507,27 @@ Sema::ActOnTemplateDeclarator(Scope *S,
|
|||
return HandleDeclarator(S, D, move(TemplateParameterLists), false);
|
||||
}
|
||||
|
||||
Sema::DeclPtrTy
|
||||
Sema::ActOnStartOfFunctionTemplateDef(Scope *FnBodyScope,
|
||||
MultiTemplateParamsArg TemplateParameterLists,
|
||||
Declarator &D) {
|
||||
assert(getCurFunctionDecl() == 0 && "Function parsing confused");
|
||||
assert(D.getTypeObject(0).Kind == DeclaratorChunk::Function &&
|
||||
"Not a function declarator!");
|
||||
DeclaratorChunk::FunctionTypeInfo &FTI = D.getTypeObject(0).Fun;
|
||||
|
||||
if (FTI.hasPrototype) {
|
||||
// FIXME: Diagnose arguments without names in C.
|
||||
}
|
||||
|
||||
Scope *ParentScope = FnBodyScope->getParent();
|
||||
|
||||
DeclPtrTy DP = HandleDeclarator(ParentScope, D,
|
||||
move(TemplateParameterLists),
|
||||
/*IsFunctionDefinition=*/true);
|
||||
return ActOnStartOfFunctionDef(FnBodyScope, DP);
|
||||
}
|
||||
|
||||
// Explicit instantiation of a class template specialization
|
||||
Sema::DeclResult
|
||||
Sema::ActOnExplicitInstantiation(Scope *S, SourceLocation TemplateLoc,
|
||||
|
|
|
@ -37,7 +37,7 @@ template <template <typename> class T = foo> class TTP3; // FIXME:expected-error
|
|||
template <template <typename> class = foo> class TTP3; // FIXME:expected-error{{template argument for template template parameter must be a template}}
|
||||
template <template <typename X, typename Y> class T> class TTP5;
|
||||
|
||||
// Forward declararations with non-type params
|
||||
// Forward declarations with non-type params
|
||||
template <int> class NTP0;
|
||||
template <int N> class NTP1;
|
||||
template <int N = 5> class NTP2;
|
||||
|
|
Загрузка…
Ссылка в новой задаче