diff options
author | Abramo Bagnara <abramo.bagnara@bugseng.com> | 2012-10-04 21:42:10 +0000 |
---|---|---|
committer | Abramo Bagnara <abramo.bagnara@bugseng.com> | 2012-10-04 21:42:10 +0000 |
commit | 59c0a818a79be850f7ae8fdafd57a1710e5b809a (patch) | |
tree | e52b54d595d603dea2e8e8265ce1d1f293f053c4 /lib/Parse/ParseDecl.cpp | |
parent | 635311f94e8fd4ff153130d91046ff78ffe97b06 (diff) |
Fixed FunctionTypeLoc source range.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165259 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseDecl.cpp')
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 27cc4843cf..52bd4166bb 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -4581,7 +4581,11 @@ void Parser::ParseFunctionDeclarator(Declarator &D, Actions.ActOnStartFunctionDeclarator(); - SourceLocation EndLoc; + SourceLocation StartLoc, EndLoc; + SourceLocation LParenLoc, RParenLoc; + LParenLoc = Tracker.getOpenLocation(); + StartLoc = LParenLoc; + if (isFunctionDeclaratorIdentifierList()) { if (RequiresArg) Diag(Tok, diag::err_argument_required_after_attribute); @@ -4589,7 +4593,8 @@ void Parser::ParseFunctionDeclarator(Declarator &D, ParseFunctionDeclaratorIdentifierList(D, ParamInfo); Tracker.consumeClose(); - EndLoc = Tracker.getCloseLocation(); + RParenLoc = Tracker.getCloseLocation(); + EndLoc = RParenLoc; } else { if (Tok.isNot(tok::r_paren)) ParseParameterDeclarationClause(D, FirstArgAttrs, ParamInfo, EllipsisLoc); @@ -4600,7 +4605,8 @@ void Parser::ParseFunctionDeclarator(Declarator &D, // If we have the closing ')', eat it. Tracker.consumeClose(); - EndLoc = Tracker.getCloseLocation(); + RParenLoc = Tracker.getCloseLocation(); + EndLoc = RParenLoc; if (getLangOpts().CPlusPlus) { // FIXME: Accept these components in any order, and produce fixits to @@ -4658,19 +4664,21 @@ void Parser::ParseFunctionDeclarator(Declarator &D, // Parse trailing-return-type[opt]. if (getLangOpts().CPlusPlus0x && Tok.is(tok::arrow)) { Diag(Tok, diag::warn_cxx98_compat_trailing_return_type); + if (D.getDeclSpec().getTypeSpecType() == TST_auto) + StartLoc = D.getDeclSpec().getTypeSpecTypeLoc(); + EndLoc = Tok.getLocation(); SourceRange Range; TrailingReturnType = ParseTrailingReturnType(Range); - if (Range.getEnd().isValid()) - EndLoc = Range.getEnd(); } } } // Remember that we parsed a function type, and remember the attributes. D.AddTypeInfo(DeclaratorChunk::getFunction(HasProto, - /*isVariadic=*/EllipsisLoc.isValid(), - IsAmbiguous, EllipsisLoc, + IsAmbiguous, + LParenLoc, ParamInfo.data(), ParamInfo.size(), + EllipsisLoc, RParenLoc, DS.getTypeQualifiers(), RefQualifierIsLValueRef, RefQualifierLoc, ConstQualifierLoc, @@ -4682,8 +4690,7 @@ void Parser::ParseFunctionDeclarator(Declarator &D, DynamicExceptions.size(), NoexceptExpr.isUsable() ? NoexceptExpr.get() : 0, - Tracker.getOpenLocation(), - EndLoc, D, + StartLoc, EndLoc, D, TrailingReturnType), FnAttrs, EndLoc); |