From 6ad2072125e9fdac5a59db424b093087b1518323 Mon Sep 17 00:00:00 2001 From: Eli Bendersky Date: Mon, 23 Mar 2015 21:43:28 +0000 Subject: [PATCH] Record correct source range for defaulted/deleted members. Fixes https://llvm.org/bugs/show_bug.cgi?id=20744 struct A { A() = default; }; Previously the source range of the declaration of A ended at the ')'. It should include the '= default' part as well. The same for '= delete'. Note: this will break one of the clang-tidy fixers, which is going to be addessed in a follow-up patch. Differential Revision: http://reviews.llvm.org/D8465 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233028 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseCXXInlineMethods.cpp | 7 +++++++ test/Analysis/inlining/path-notes.cpp | 10 +++++----- test/Misc/ast-dump-decl.cpp | 13 ++++++------- unittests/AST/SourceLocationTest.cpp | 12 ++++++++++++ 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/lib/Parse/ParseCXXInlineMethods.cpp b/lib/Parse/ParseCXXInlineMethods.cpp index 86ac471ddb..cd438f7437 100644 --- a/lib/Parse/ParseCXXInlineMethods.cpp +++ b/lib/Parse/ParseCXXInlineMethods.cpp @@ -71,17 +71,24 @@ NamedDecl *Parser::ParseCXXInlineMethodDef(AccessSpecifier AS, bool Delete = false; SourceLocation KWLoc; + SourceLocation KWEndLoc = Tok.getEndLoc().getLocWithOffset(-1); if (TryConsumeToken(tok::kw_delete, KWLoc)) { Diag(KWLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_deleted_function : diag::ext_deleted_function); Actions.SetDeclDeleted(FnD, KWLoc); Delete = true; + if (auto *DeclAsFunction = dyn_cast(FnD)) { + DeclAsFunction->setRangeEnd(KWEndLoc); + } } else if (TryConsumeToken(tok::kw_default, KWLoc)) { Diag(KWLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_defaulted_function : diag::ext_defaulted_function); Actions.SetDeclDefaulted(FnD, KWLoc); + if (auto *DeclAsFunction = dyn_cast(FnD)) { + DeclAsFunction->setRangeEnd(KWEndLoc); + } } else { llvm_unreachable("function definition after = not 'delete' or 'default'"); } diff --git a/test/Analysis/inlining/path-notes.cpp b/test/Analysis/inlining/path-notes.cpp index 30ce8c8c6e..30725115c2 100644 --- a/test/Analysis/inlining/path-notes.cpp +++ b/test/Analysis/inlining/path-notes.cpp @@ -2458,12 +2458,12 @@ namespace PR17746 { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line105 -// CHECK-NEXT: col53 +// CHECK-NEXT: col63 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line105 -// CHECK-NEXT: col53 +// CHECK-NEXT: col63 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -2475,7 +2475,7 @@ namespace PR17746 { // CHECK-NEXT: location // CHECK-NEXT: // CHECK-NEXT: line105 -// CHECK-NEXT: col53 +// CHECK-NEXT: col63 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: ranges @@ -2483,12 +2483,12 @@ namespace PR17746 { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line105 -// CHECK-NEXT: col53 +// CHECK-NEXT: col63 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line105 -// CHECK-NEXT: col53 +// CHECK-NEXT: col63 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: diff --git a/test/Misc/ast-dump-decl.cpp b/test/Misc/ast-dump-decl.cpp index fe7ea7503d..9e94a30819 100644 --- a/test/Misc/ast-dump-decl.cpp +++ b/test/Misc/ast-dump-decl.cpp @@ -139,7 +139,6 @@ class TestCXXDestructorDecl { // CHECK-NEXT: CompoundStmt // Test that the range of a defaulted members is computed correctly. -// FIXME: This should include the "= default". class TestMemberRanges { public: TestMemberRanges() = default; @@ -156,12 +155,12 @@ void SomeFunction() { A = static_cast(B); TestMemberRanges C(static_cast(A)); } -// CHECK: CXXConstructorDecl{{.*}} -// CHECK: CXXConstructorDecl{{.*}} -// CHECK: CXXConstructorDecl{{.*}} -// CHECK: CXXDestructorDecl{{.*}} -// CHECK: CXXMethodDecl{{.*}} -// CHECK: CXXMethodDecl{{.*}} +// CHECK: CXXConstructorDecl{{.*}} +// CHECK: CXXConstructorDecl{{.*}} +// CHECK: CXXConstructorDecl{{.*}} +// CHECK: CXXDestructorDecl{{.*}} +// CHECK: CXXMethodDecl{{.*}} +// CHECK: CXXMethodDecl{{.*}} class TestCXXConversionDecl { operator int() { return 0; } diff --git a/unittests/AST/SourceLocationTest.cpp b/unittests/AST/SourceLocationTest.cpp index ca5a8892a5..98460d959c 100644 --- a/unittests/AST/SourceLocationTest.cpp +++ b/unittests/AST/SourceLocationTest.cpp @@ -122,6 +122,18 @@ TEST(CXXConstructorDecl, NoRetFunTypeLocRange) { EXPECT_TRUE(Verifier.match("class C { C(); };", functionDecl())); } +TEST(CXXConstructorDecl, DefaultedCtorLocRange) { + RangeVerifier Verifier; + Verifier.expectRange(1, 11, 1, 23); + EXPECT_TRUE(Verifier.match("class C { C() = default; };", functionDecl())); +} + +TEST(CXXConstructorDecl, DeletedCtorLocRange) { + RangeVerifier Verifier; + Verifier.expectRange(1, 11, 1, 22); + EXPECT_TRUE(Verifier.match("class C { C() = delete; };", functionDecl())); +} + TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) { RangeVerifier Verifier; Verifier.expectRange(2, 11, 2, 22); -- 2.40.0