diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Parse/ParseDeclCXX.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Parse/ParseExprCXX.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Sema/DeclSpec.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 8 |
5 files changed, 15 insertions, 6 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 01a1657..281cd6d 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -6429,6 +6429,7 @@ void Parser::ParseFunctionDeclarator(Declarator &D, CachedTokens *ExceptionSpecTokens = nullptr; ParsedAttributesWithRange FnAttrs(AttrFactory); TypeResult TrailingReturnType; + SourceLocation TrailingReturnTypeLoc; /* LocalEndLoc is the end location for the local FunctionTypeLoc. EndLoc is the end location for the function declarator. @@ -6539,6 +6540,7 @@ void Parser::ParseFunctionDeclarator(Declarator &D, SourceRange Range; TrailingReturnType = ParseTrailingReturnType(Range, D.mayBeFollowedByCXXDirectInit()); + TrailingReturnTypeLoc = Range.getBegin(); EndLoc = Range.getEnd(); } } else if (standardAttributesAllowed()) { @@ -6571,7 +6573,8 @@ void Parser::ParseFunctionDeclarator(Declarator &D, DynamicExceptionRanges.data(), DynamicExceptions.size(), NoexceptExpr.isUsable() ? NoexceptExpr.get() : nullptr, ExceptionSpecTokens, DeclsInPrototype, StartLoc, - LocalEndLoc, D, TrailingReturnType, &DS), + LocalEndLoc, D, TrailingReturnType, TrailingReturnTypeLoc, + &DS), std::move(FnAttrs), EndLoc); } diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index a903896..6e9eced 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -3898,6 +3898,7 @@ void Parser::ParseTrailingRequiresClause(Declarator &D) { auto &FunctionChunk = D.getFunctionTypeInfo(); FunctionChunk.HasTrailingReturnType = TrailingReturnType.isUsable(); FunctionChunk.TrailingReturnType = TrailingReturnType.get(); + FunctionChunk.TrailingReturnTypeLoc = Range.getBegin().getRawEncoding(); } else SkipUntil({tok::equal, tok::l_brace, tok::arrow, tok::kw_try, tok::comma}, StopAtSemi | StopBeforeMatch); diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp index b225bb7..8181d2a 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -1293,6 +1293,7 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( } TypeResult TrailingReturnType; + SourceLocation TrailingReturnTypeLoc; if (Tok.is(tok::l_paren)) { ParseScope PrototypeScope(this, Scope::FunctionPrototypeScope | @@ -1379,6 +1380,7 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( SourceRange Range; TrailingReturnType = ParseTrailingReturnType(Range, /*MayBeFollowedByDirectInit*/ false); + TrailingReturnTypeLoc = Range.getBegin(); if (Range.getEnd().isValid()) DeclEndLoc = Range.getEnd(); } @@ -1395,7 +1397,7 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( NoexceptExpr.isUsable() ? NoexceptExpr.get() : nullptr, /*ExceptionSpecTokens*/ nullptr, /*DeclsInPrototype=*/None, LParenLoc, FunLocalRangeEnd, D, - TrailingReturnType, &DS), + TrailingReturnType, TrailingReturnTypeLoc, &DS), std::move(Attr), DeclEndLoc); // Parse requires-clause[opt]. diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp index dc37474..b139855 100644 --- a/clang/lib/Sema/DeclSpec.cpp +++ b/clang/lib/Sema/DeclSpec.cpp @@ -181,6 +181,8 @@ DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType, + SourceLocation + TrailingReturnTypeLoc, DeclSpec *MethodQualifiers) { assert(!(MethodQualifiers && MethodQualifiers->getTypeQualifiers() & DeclSpec::TQ_atomic) && "function cannot have _Atomic qualifier"); @@ -210,6 +212,7 @@ DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto, I.Fun.HasTrailingReturnType = TrailingReturnType.isUsable() || TrailingReturnType.isInvalid(); I.Fun.TrailingReturnType = TrailingReturnType.get(); + I.Fun.TrailingReturnTypeLoc = TrailingReturnTypeLoc.getRawEncoding(); I.Fun.MethodQualifiers = nullptr; I.Fun.QualAttrFactory = nullptr; diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 1ba1869..21aa208 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3084,12 +3084,12 @@ void Sema::diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals, static void diagnoseRedundantReturnTypeQualifiers(Sema &S, QualType RetTy, Declarator &D, unsigned FunctionChunkIndex) { - if (D.getTypeObject(FunctionChunkIndex).Fun.hasTrailingReturnType()) { - // FIXME: TypeSourceInfo doesn't preserve location information for - // qualifiers. + const DeclaratorChunk::FunctionTypeInfo &FTI = + D.getTypeObject(FunctionChunkIndex).Fun; + if (FTI.hasTrailingReturnType()) { S.diagnoseIgnoredQualifiers(diag::warn_qual_return_type, RetTy.getLocalCVRQualifiers(), - D.getIdentifierLoc()); + FTI.getTrailingReturnTypeLoc()); return; } |