diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3084,12 +3084,16 @@ static void diagnoseRedundantReturnTypeQualifiers(Sema &S, QualType RetTy, Declarator &D, unsigned FunctionChunkIndex) { - if (D.getTypeObject(FunctionChunkIndex).Fun.hasTrailingReturnType()) { + const DeclaratorChunk::FunctionTypeInfo &FTI = + D.getTypeObject(FunctionChunkIndex).Fun; + if (FTI.hasTrailingReturnType()) { // FIXME: TypeSourceInfo doesn't preserve location information for // qualifiers. + SourceLocation Loc = D.getIdentifierLoc(); + if (Loc.isInvalid()) + Loc = FTI.getRParenLoc(); S.diagnoseIgnoredQualifiers(diag::warn_qual_return_type, - RetTy.getLocalCVRQualifiers(), - D.getIdentifierLoc()); + RetTy.getLocalCVRQualifiers(), Loc); return; } diff --git a/clang/test/SemaCXX/return.cpp b/clang/test/SemaCXX/return.cpp --- a/clang/test/SemaCXX/return.cpp +++ b/clang/test/SemaCXX/return.cpp @@ -65,6 +65,10 @@ trailing_return_type() -> // expected-warning {{'const' type qualifier on return type has no effect}} const int; +auto trailing_return_type_lambda = + [](const int &x) -> // expected-warning {{'const' type qualifier on return type has no effect}} + const int { return x; }; + const int ret_array()[4]; // expected-error {{cannot return array}} }