Index: lib/Sema/SemaDeclCXX.cpp =================================================================== --- lib/Sema/SemaDeclCXX.cpp +++ lib/Sema/SemaDeclCXX.cpp @@ -8418,7 +8418,7 @@ return; } - SourceLocation Loc = Constructor->getLocation(); + SourceLocation Loc = Constructor->getLocEnd(); Constructor->setBody(new (Context) CompoundStmt(Loc)); Constructor->markUsed(Context); @@ -8880,7 +8880,7 @@ return; } - SourceLocation Loc = Destructor->getLocation(); + SourceLocation Loc = Destructor->getLocEnd(); Destructor->setBody(new (Context) CompoundStmt(Loc)); Destructor->markUsed(Context); MarkVTableUsed(CurrentLocation, ClassDecl); @@ -9580,7 +9580,7 @@ } // Our location for everything implicitly-generated. - SourceLocation Loc = CopyAssignOperator->getLocation(); + SourceLocation Loc = CopyAssignOperator->getLocEnd(); // Builds a DeclRefExpr for the "other" object. RefBuilder OtherRef(Other, OtherRefType); @@ -9985,7 +9985,7 @@ "Bad argument type of defaulted move assignment"); // Our location for everything implicitly-generated. - SourceLocation Loc = MoveAssignOperator->getLocation(); + SourceLocation Loc = MoveAssignOperator->getLocEnd(); // Builds a reference to the "other" object. RefBuilder OtherRef(Other, OtherRefType); @@ -10122,8 +10122,9 @@ if (!Invalid) { // Add a "return *this;" - ExprResult ThisObj = CreateBuiltinUnaryOp(Loc, UO_Deref, This.build(*this, Loc)); - + ExprResult ThisObj = + CreateBuiltinUnaryOp(Loc, UO_Deref, This.build(*this, Loc)); + StmtResult Return = BuildReturnStmt(Loc, ThisObj.get()); if (Return.isInvalid()) Invalid = true; @@ -10301,7 +10302,7 @@ } else { Sema::CompoundScopeRAII CompoundScope(*this); CopyConstructor->setBody(ActOnCompoundStmt( - CopyConstructor->getLocation(), CopyConstructor->getLocation(), None, + CopyConstructor->getLocEnd(), CopyConstructor->getLocEnd(), None, /*isStmtExpr=*/ false).getAs()); } @@ -10457,7 +10458,7 @@ } else { Sema::CompoundScopeRAII CompoundScope(*this); MoveConstructor->setBody(ActOnCompoundStmt( - MoveConstructor->getLocation(), MoveConstructor->getLocation(), None, + MoveConstructor->getLocEnd(), MoveConstructor->getLocEnd(), None, /*isStmtExpr=*/ false).getAs()); } Index: test/Misc/ast-dump-decl.cpp =================================================================== --- test/Misc/ast-dump-decl.cpp +++ test/Misc/ast-dump-decl.cpp @@ -133,6 +133,31 @@ // CHECK: CXXDestructorDecl{{.*}} ~TestCXXDestructorDecl 'void (void) noexcept' // 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; + TestMemberRanges(const TestMemberRanges &Other) = default; + TestMemberRanges(TestMemberRanges &&Other) = default; + ~TestMemberRanges() = default; + TestMemberRanges &operator=(const TestMemberRanges &Other) = default; + TestMemberRanges &operator=(TestMemberRanges &&Other) = default; +}; +void SomeFunction() { + TestMemberRanges A; + TestMemberRanges B(A); + B = A; + A = static_cast(B); + TestMemberRanges C(static_cast(A)); +} +// CHECK: CXXConstructorDecl{{.*}} +// CHECK: CXXConstructorDecl{{.*}} +// CHECK: CXXConstructorDecl{{.*}} +// CHECK: CXXDestructorDecl{{.*}} +// CHECK: CXXMethodDecl{{.*}} +// CHECK: CXXMethodDecl{{.*}} + class TestCXXConversionDecl { operator int() { return 0; } };