Index: cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp =================================================================== --- cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp +++ cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp @@ -71,17 +71,24 @@ 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'"); } Index: cfe/trunk/test/Analysis/inlining/path-notes.cpp =================================================================== --- cfe/trunk/test/Analysis/inlining/path-notes.cpp +++ cfe/trunk/test/Analysis/inlining/path-notes.cpp @@ -2458,12 +2458,12 @@ // 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 @@ // 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 @@ // 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: Index: cfe/trunk/test/Misc/ast-dump-decl.cpp =================================================================== --- cfe/trunk/test/Misc/ast-dump-decl.cpp +++ cfe/trunk/test/Misc/ast-dump-decl.cpp @@ -139,7 +139,6 @@ // 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 @@ 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; } Index: cfe/trunk/unittests/AST/SourceLocationTest.cpp =================================================================== --- cfe/trunk/unittests/AST/SourceLocationTest.cpp +++ cfe/trunk/unittests/AST/SourceLocationTest.cpp @@ -122,6 +122,18 @@ 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);