// Test without serialization: // RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-dump %s \ // RUN: | FileCheck -strict-whitespace %s // // Test with serialization: // RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -emit-pch -o %t %s // RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -std=c++17 -include-pch %t -ast-dump-all /dev/null \ // RUN: | sed -e "s/ //" -e "s/ imported//" \ // RUN: | FileCheck -strict-whitespace %s // FIXME: exists struct TrivialDefaultConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} <{{.*}}:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialDefaultConstructor definition // CHECK: DefaultConstructor {{.*}} trivial{{.*}} TrivialDefaultConstructor() = default; }; struct NontrivialDefaultConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NontrivialDefaultConstructor definition // CHECK: DefaultConstructor {{.*}}non_trivial{{.*}} NontrivialDefaultConstructor() {} }; struct UserProvidedDefaultConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct UserProvidedDefaultConstructor definition // CHECK: DefaultConstructor {{.*}}user_provided{{.*}} UserProvidedDefaultConstructor() {} }; struct NonUserProvidedDefaultConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NonUserProvidedDefaultConstructor definition // CHECK-NOT: DefaultConstructor {{.*}}user_provided{{.*}} }; struct HasConstexprDefaultConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct HasConstexprDefaultConstructor definition // CHECK: DefaultConstructor {{.*}}constexpr{{.*}} constexpr HasConstexprDefaultConstructor() {} }; struct DoesNotHaveConstexprDefaultConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DoesNotHaveConstexprDefaultConstructor definition // CHECK-NOT: DefaultConstructor {{.*}} constexpr{{.*}} DoesNotHaveConstexprDefaultConstructor() {} }; struct NeedsImplicitDefaultConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NeedsImplicitDefaultConstructor definition // CHECK: DefaultConstructor {{.*}}needs_implicit{{.*}} int i = 12; }; struct DoesNotNeedImplicitDefaultConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DoesNotNeedImplicitDefaultConstructor definition // CHECK-NOT: DefaultConstructor {{.*}}needs_implicit{{.*}} DoesNotNeedImplicitDefaultConstructor() {} }; struct DefaultedDefaultConstructorIsConstexpr { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DefaultedDefaultConstructorIsConstexpr definition // CHECK: DefaultConstructor {{.*}}defaulted_is_constexpr{{.*}} DefaultedDefaultConstructorIsConstexpr() = default; }; struct DefaultedDefaultConstructorIsNotConstexpr { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DefaultedDefaultConstructorIsNotConstexpr definition // CHECK-NOT: DefaultConstructor {{.*}}defaulted_is_constexpr{{.*}} DefaultedDefaultConstructorIsNotConstexpr() = default; union { int i; }; }; struct SimpleCopyConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct SimpleCopyConstructor definition // CHECK: CopyConstructor {{.*}}simple{{.*}} int i = 12; }; struct NotSimpleCopyConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NotSimpleCopyConstructor definition // CHECK-NOT: CopyConstructor {{.*}}simple{{.*}} NotSimpleCopyConstructor(const NotSimpleCopyConstructor&) = delete; }; struct TrivialCopyConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct TrivialCopyConstructor definition // CHECK: CopyConstructor {{.*}} trivial{{.*}} TrivialCopyConstructor() = default; }; struct NontrivialCopyConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NontrivialCopyConstructor definition // CHECK: CopyConstructor {{.*}}non_trivial{{.*}} NontrivialCopyConstructor(const NontrivialCopyConstructor&) {} }; struct UserDeclaredCopyConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct UserDeclaredCopyConstructor definition // CHECK: CopyConstructor {{.*}}user_declared{{.*}} UserDeclaredCopyConstructor(const UserDeclaredCopyConstructor&) {} }; struct NonUserDeclaredCopyConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NonUserDeclaredCopyConstructor definition // CHECK-NOT: CopyConstructor {{.*}}user_declared{{.*}} }; struct CopyConstructorHasConstParam { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct CopyConstructorHasConstParam definition // CHECK: CopyConstructor {{.*}}has_const_param{{.*}} CopyConstructorHasConstParam(const CopyConstructorHasConstParam&) {} }; struct CopyConstructorDoesNotHaveConstParam { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct CopyConstructorDoesNotHaveConstParam definition // CHECK-NOT: CopyConstructor {{.*}} has_const_param{{.*}} CopyConstructorDoesNotHaveConstParam(CopyConstructorDoesNotHaveConstParam&) {} }; struct NeedsImplicitCopyConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NeedsImplicitCopyConstructor definition // CHECK: CopyConstructor {{.*}}needs_implicit{{.*}} int i = 12; }; struct DoesNotNeedImplicitCopyConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DoesNotNeedImplicitCopyConstructor definition // CHECK-NOT: CopyConstructor {{.*}}needs_implicit{{.*}} DoesNotNeedImplicitCopyConstructor(const DoesNotNeedImplicitCopyConstructor&) {} }; struct DeletedDestructor { private: ~DeletedDestructor() = delete; }; struct CopyConstructorNeedsOverloadResolution : virtual DeletedDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct CopyConstructorNeedsOverloadResolution definition // CHECK: CopyConstructor {{.*}}needs_overload_resolution{{.*}} }; struct CopyConstructorDoesNotNeedOverloadResolution { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct CopyConstructorDoesNotNeedOverloadResolution definition // CHECK-NOT: CopyConstructor {{.*}}needs_overload_resolution{{.*}} }; struct DefaultedCopyConstructorIsDeleted { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DefaultedCopyConstructorIsDeleted definition // CHECK: CopyConstructor {{.*}}defaulted_is_deleted{{.*}} int &&i; DefaultedCopyConstructorIsDeleted(const DefaultedCopyConstructorIsDeleted&) = default; }; struct DefaultedCopyConstructorIsNotDeleted { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DefaultedCopyConstructorIsNotDeleted definition // CHECK-NOT: CopyConstructor {{.*}}defaulted_is_deleted{{.*}} int i; DefaultedCopyConstructorIsNotDeleted(const DefaultedCopyConstructorIsNotDeleted&) = default; }; struct BaseWithoutCopyConstructorConstParam { BaseWithoutCopyConstructorConstParam(BaseWithoutCopyConstructorConstParam&); }; struct ImplicitCopyConstructorHasConstParam { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct ImplicitCopyConstructorHasConstParam definition // CHECK: CopyConstructor {{.*}}implicit_has_const_param{{.*}} }; struct ImplicitCopyConstructorDoesNotHaveConstParam : BaseWithoutCopyConstructorConstParam { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct ImplicitCopyConstructorDoesNotHaveConstParam definition // CHECK-NOT: CopyConstructor {{.*}}implicit_has_const_param{{.*}} }; struct MoveConstructorExists { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct MoveConstructorExists definition // CHECK: MoveConstructor {{.*}}exists{{.*}} }; struct MoveConstructorDoesNotExist { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct MoveConstructorDoesNotExist definition // CHECK-NOT: MoveConstructor {{.*}}exists{{.*}} MoveConstructorDoesNotExist(const MoveConstructorDoesNotExist&); }; struct SimpleMoveConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct SimpleMoveConstructor definition // CHECK: MoveConstructor {{.*}}simple{{.*}} int i = 12; }; struct NotSimpleMoveConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NotSimpleMoveConstructor definition // CHECK-NOT: MoveConstructor {{.*}}simple{{.*}} NotSimpleMoveConstructor(NotSimpleMoveConstructor&&) = delete; }; struct TrivialMoveConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct TrivialMoveConstructor definition // CHECK: MoveConstructor {{.*}} trivial{{.*}} TrivialMoveConstructor() = default; }; struct NontrivialMoveConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NontrivialMoveConstructor definition // CHECK: MoveConstructor {{.*}}non_trivial{{.*}} NontrivialMoveConstructor(NontrivialMoveConstructor&&) {} }; struct UserDeclaredMoveConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct UserDeclaredMoveConstructor definition // CHECK: MoveConstructor {{.*}}user_declared{{.*}} UserDeclaredMoveConstructor(UserDeclaredMoveConstructor&&) {} }; struct NonUserDeclaredMoveConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NonUserDeclaredMoveConstructor definition // CHECK-NOT: MoveConstructor {{.*}}user_declared{{.*}} }; struct NeedsImplicitMoveConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NeedsImplicitMoveConstructor definition // CHECK: MoveConstructor {{.*}}needs_implicit{{.*}} int i = 12; }; struct DoesNotNeedImplicitMoveConstructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DoesNotNeedImplicitMoveConstructor definition // CHECK-NOT: MoveConstructor {{.*}}needs_implicit{{.*}} DoesNotNeedImplicitMoveConstructor(DoesNotNeedImplicitMoveConstructor&&) {} }; struct MoveConstructorNeedsOverloadResolution : virtual DeletedDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct MoveConstructorNeedsOverloadResolution definition // CHECK: MoveConstructor {{.*}}needs_overload_resolution{{.*}} }; struct MoveConstructorDoesNotNeedOverloadResolution { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct MoveConstructorDoesNotNeedOverloadResolution definition // CHECK-NOT: MoveConstructor {{.*}}needs_overload_resolution{{.*}} }; // FIXME: defaulted_is_deleted struct TrivialCopyAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct TrivialCopyAssignment definition // CHECK: CopyAssignment {{.*}} trivial{{.*}} TrivialCopyAssignment& operator=(const TrivialCopyAssignment&) = default; }; struct NontrivialCopyAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NontrivialCopyAssignment definition // CHECK: CopyAssignment {{.*}}non_trivial{{.*}} NontrivialCopyAssignment& operator=(const NontrivialCopyAssignment&) {} }; struct CopyAssignmentHasConstParam { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct CopyAssignmentHasConstParam definition // CHECK: CopyAssignment {{.*}}has_const_param{{.*}} CopyAssignmentHasConstParam& operator=(const CopyAssignmentHasConstParam&) {} }; struct CopyAssignmentDoesNotHaveConstParam { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct CopyAssignmentDoesNotHaveConstParam definition // CHECK-NOT: CopyAssignment {{.*}} has_const_param{{.*}} CopyAssignmentDoesNotHaveConstParam& operator=(CopyAssignmentDoesNotHaveConstParam&) {} }; struct UserDeclaredCopyAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct UserDeclaredCopyAssignment definition // CHECK: CopyAssignment {{.*}}user_declared{{.*}} UserDeclaredCopyAssignment& operator=(const UserDeclaredCopyAssignment&) {} }; struct NonUserDeclaredCopyAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NonUserDeclaredCopyAssignment definition // CHECK-NOT: CopyAssignment {{.*}}user_declared{{.*}} }; struct NeedsImplicitCopyAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NeedsImplicitCopyAssignment definition // CHECK: CopyAssignment {{.*}}needs_implicit{{.*}} int i = 12; }; struct DoesNotNeedImplicitCopyAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DoesNotNeedImplicitCopyAssignment definition // CHECK-NOT: CopyAssignment {{.*}}needs_implicit{{.*}} DoesNotNeedImplicitCopyAssignment& operator=(const DoesNotNeedImplicitCopyAssignment&) {} }; struct DeclaresCopyAssignment { DeclaresCopyAssignment &operator=(const DeclaresCopyAssignment&) &; }; struct CopyAssignmentNeedsOverloadResolution { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct CopyAssignmentNeedsOverloadResolution definition // CHECK: CopyAssignment {{.*}}needs_overload_resolution{{.*}} DeclaresCopyAssignment i; }; struct CopyAssignmentDoesNotNeedOverloadResolution { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct CopyAssignmentDoesNotNeedOverloadResolution definition // CHECK-NOT: CopyAssignment {{.*}}needs_overload_resolution{{.*}} }; struct BaseWithoutCopyAssignmentConstParam { BaseWithoutCopyAssignmentConstParam& operator=(BaseWithoutCopyAssignmentConstParam&); }; struct ImplicitCopyAssignmentHasConstParam { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct ImplicitCopyAssignmentHasConstParam definition // CHECK: CopyAssignment {{.*}}implicit_has_const_param{{.*}} }; struct ImplicitCopyAssignmentDoesNotHaveConstParam : BaseWithoutCopyAssignmentConstParam { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct ImplicitCopyAssignmentDoesNotHaveConstParam definition // CHECK-NOT: CopyAssignment {{.*}}implicit_has_const_param{{.*}} }; struct MoveAssignmentExists { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct MoveAssignmentExists definition // CHECK: MoveAssignment {{.*}}exists{{.*}} }; struct MoveAssignmentDoesNotExist { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct MoveAssignmentDoesNotExist definition // CHECK-NOT: MoveAssignment {{.*}}exists{{.*}} MoveAssignmentDoesNotExist& operator=(const MoveAssignmentDoesNotExist&); }; struct SimpleMoveAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct SimpleMoveAssignment definition // CHECK: MoveAssignment {{.*}}simple{{.*}} int i = 12; }; struct NotSimpleMoveAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NotSimpleMoveAssignment definition // CHECK-NOT: MoveAssignment {{.*}}simple{{.*}} NotSimpleMoveAssignment& operator=(NotSimpleMoveAssignment&&) = delete; }; struct TrivialMoveAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct TrivialMoveAssignment definition // CHECK: MoveAssignment {{.*}} trivial{{.*}} TrivialMoveAssignment() = default; }; struct NontrivialMoveAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NontrivialMoveAssignment definition // CHECK: MoveAssignment {{.*}}non_trivial{{.*}} NontrivialMoveAssignment& operator=(NontrivialMoveAssignment&&) {} }; struct UserDeclaredMoveAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct UserDeclaredMoveAssignment definition // CHECK: MoveAssignment {{.*}}user_declared{{.*}} UserDeclaredMoveAssignment& operator=(UserDeclaredMoveAssignment&&) {} }; struct NonUserDeclaredMoveAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NonUserDeclaredMoveAssignment definition // CHECK-NOT: MoveAssignment {{.*}}user_declared{{.*}} }; struct NeedsImplicitMoveAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NeedsImplicitMoveAssignment definition // CHECK: MoveAssignment {{.*}}needs_implicit{{.*}} int i = 12; }; struct DoesNotNeedImplicitMoveAssignment { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DoesNotNeedImplicitMoveAssignment definition // CHECK-NOT: MoveAssignment {{.*}}needs_implicit{{.*}} DoesNotNeedImplicitMoveAssignment& operator=(DoesNotNeedImplicitMoveAssignment&&) {} }; struct MoveAssignmentNeedsOverloadResolution : virtual DeletedDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct MoveAssignmentNeedsOverloadResolution definition // CHECK: MoveAssignment {{.*}}needs_overload_resolution{{.*}} }; struct MoveAssignmentDoesNotNeedOverloadResolution { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct MoveAssignmentDoesNotNeedOverloadResolution definition // CHECK-NOT: MoveAssignment {{.*}}needs_overload_resolution{{.*}} }; struct SimpleDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct SimpleDestructor definition // CHECK: Destructor {{.*}}simple{{.*}} }; struct NotSimpleDestructor : DeletedDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NotSimpleDestructor definition // CHECK-NOT: Destructor {{.*}}simple{{.*}} }; struct IrrelevantDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct IrrelevantDestructor definition // CHECK: Destructor {{.*}}irrelevant{{.*}} }; struct RelevantDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct RelevantDestructor definition // CHECK-NOT: Destructor {{.*}}irrelevant{{.*}} ~RelevantDestructor() {} }; struct TrivialDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct TrivialDestructor definition // CHECK: Destructor {{.*}} trivial{{.*}} ~TrivialDestructor() = default; }; struct NontrivialDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NontrivialDestructor definition // CHECK: Destructor {{.*}}non_trivial{{.*}} ~NontrivialDestructor() {} }; struct UserDeclaredDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct UserDeclaredDestructor definition // CHECK: Destructor {{.*}}user_declared{{.*}} ~UserDeclaredDestructor() {} }; struct NonUserDeclaredDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NonUserDeclaredDestructor definition // CHECK-NOT: Destructor {{.*}}user_declared{{.*}} }; struct NeedsImplicitDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct NeedsImplicitDestructor definition // CHECK: Destructor {{.*}}needs_implicit{{.*}} int i = 12; }; struct DoesNotNeedImplicitDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DoesNotNeedImplicitDestructor definition // CHECK-NOT: Destructor {{.*}}needs_implicit{{.*}} ~DoesNotNeedImplicitDestructor() {} }; struct DestructorNeedsOverloadResolution : virtual DeletedDestructor { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DestructorNeedsOverloadResolution definition // CHECK: Destructor {{.*}}needs_overload_resolution{{.*}} ~DestructorNeedsOverloadResolution(); }; struct DestructorDoesNotNeedOverloadResolution { // CHECK: CXXRecordDecl 0x{{[^ ]*}} line:[[@LINE-1]]:8 struct DestructorDoesNotNeedOverloadResolution definition // CHECK-NOT: Destructor {{.*}}needs_overload_resolution{{.*}} }; // FIXME: defaulted_is_deleted