diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-03-12 23:14:33 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-03-12 23:14:33 +0000 |
commit | 8e6002f3bd52a87d697b348ac5d049898c8214d5 (patch) | |
tree | 2704abd975118fcf98e6cd20b6b270e4331d05bb /clang/lib/Parse/Parser.cpp | |
parent | 8a5a590cd1a058bf7227daf8b0de43a84822200b (diff) | |
download | llvm-8e6002f3bd52a87d697b348ac5d049898c8214d5.zip llvm-8e6002f3bd52a87d697b348ac5d049898c8214d5.tar.gz llvm-8e6002f3bd52a87d697b348ac5d049898c8214d5.tar.bz2 |
Fix crash if delayed template parsing meets an erroneous trailing return type.
Based on a patch and test by Stephan Tolksdorf! Refactoring and fixing adjacent
brokenness by me.
llvm-svn: 203733
Diffstat (limited to 'clang/lib/Parse/Parser.cpp')
-rw-r--r-- | clang/lib/Parse/Parser.cpp | 28 |
1 files changed, 4 insertions, 24 deletions
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index e882b0a..9936a5a 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -901,26 +901,6 @@ Parser::ParseDeclarationOrFunctionDefinition(ParsedAttributesWithRange &attrs, } } - -static inline bool isFunctionDeclaratorRequiringReturnTypeDeduction( - const Declarator &D) { - if (!D.isFunctionDeclarator() || !D.getDeclSpec().containsPlaceholderType()) - return false; - for (unsigned I = 0, E = D.getNumTypeObjects(); I != E; ++I) { - unsigned chunkIndex = E - I - 1; - const DeclaratorChunk &DeclType = D.getTypeObject(chunkIndex); - if (DeclType.Kind == DeclaratorChunk::Function) { - const DeclaratorChunk::FunctionTypeInfo &FTI = DeclType.Fun; - if (!FTI.hasTrailingReturnType()) - return true; - QualType TrailingRetType = FTI.getTrailingReturnType().get(); - return TrailingRetType->getCanonicalTypeInternal() - ->getContainedAutoType(); - } - } - return false; -} - /// ParseFunctionDefinition - We parsed and verified that the specified /// Declarator is well formed. If this is a K&R-style function, read the /// parameters declaration-list, then start the compound-statement. @@ -996,8 +976,7 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, // tokens and store them for late parsing at the end of the translation unit. if (getLangOpts().DelayedTemplateParsing && Tok.isNot(tok::equal) && TemplateInfo.Kind == ParsedTemplateInfo::Template && - !D.getDeclSpec().isConstexprSpecified() && - !isFunctionDeclaratorRequiringReturnTypeDeduction(D)) { + Actions.canDelayFunctionBody(D)) { MultiTemplateParamsArg TemplateParameterLists(*TemplateInfo.TemplateParams); ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope); @@ -1026,7 +1005,7 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, Actions.CurContext->isTranslationUnit()) { ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope); Scope *ParentScope = getCurScope()->getParent(); - + D.setFunctionDefinitionKind(FDK_Definition); Decl *FuncDecl = Actions.HandleDeclarator(ParentScope, D, MultiTemplateParamsArg()); @@ -1038,8 +1017,9 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, CurParsedObjCImpl->HasCFunction = true; return FuncDecl; } + // FIXME: Should we really fall through here? } - + // Enter a scope for the function body. ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope); |