blob: 0b025397fa93b7801cf43ed10cc80f0a8c901d1c [file] [log] [blame]
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-dump %s | 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]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialDefaultConstructor definition
// CHECK: DefaultConstructor {{.*}}non_trivial{{.*}}
NontrivialDefaultConstructor() {}
};
struct UserProvidedDefaultConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserProvidedDefaultConstructor definition
// CHECK: DefaultConstructor {{.*}}user_provided{{.*}}
UserProvidedDefaultConstructor() {}
};
struct NonUserProvidedDefaultConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserProvidedDefaultConstructor definition
// CHECK-NOT: DefaultConstructor {{.*}}user_provided{{.*}}
};
struct HasConstexprDefaultConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasConstexprDefaultConstructor definition
// CHECK: DefaultConstructor {{.*}}constexpr{{.*}}
constexpr HasConstexprDefaultConstructor() {}
};
struct DoesNotHaveConstexprDefaultConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotHaveConstexprDefaultConstructor definition
// CHECK-NOT: DefaultConstructor {{.*}} constexpr{{.*}}
DoesNotHaveConstexprDefaultConstructor() {}
};
struct NeedsImplicitDefaultConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitDefaultConstructor definition
// CHECK: DefaultConstructor {{.*}}needs_implicit{{.*}}
int i = 12;
};
struct DoesNotNeedImplicitDefaultConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitDefaultConstructor definition
// CHECK-NOT: DefaultConstructor {{.*}}needs_implicit{{.*}}
DoesNotNeedImplicitDefaultConstructor() {}
};
struct DefaultedDefaultConstructorIsConstexpr {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DefaultedDefaultConstructorIsConstexpr definition
// CHECK: DefaultConstructor {{.*}}defaulted_is_constexpr{{.*}}
DefaultedDefaultConstructorIsConstexpr() = default;
};
struct DefaultedDefaultConstructorIsNotConstexpr {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+6]]:1> 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]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct SimpleCopyConstructor definition
// CHECK: CopyConstructor {{.*}}simple{{.*}}
int i = 12;
};
struct NotSimpleCopyConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NotSimpleCopyConstructor definition
// CHECK-NOT: CopyConstructor {{.*}}simple{{.*}}
NotSimpleCopyConstructor(const NotSimpleCopyConstructor&) = delete;
};
struct TrivialCopyConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialCopyConstructor definition
// CHECK: CopyConstructor {{.*}} trivial{{.*}}
TrivialCopyConstructor() = default;
};
struct NontrivialCopyConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialCopyConstructor definition
// CHECK: CopyConstructor {{.*}}non_trivial{{.*}}
NontrivialCopyConstructor(const NontrivialCopyConstructor&) {}
};
struct UserDeclaredCopyConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredCopyConstructor definition
// CHECK: CopyConstructor {{.*}}user_declared{{.*}}
UserDeclaredCopyConstructor(const UserDeclaredCopyConstructor&) {}
};
struct NonUserDeclaredCopyConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredCopyConstructor definition
// CHECK-NOT: CopyConstructor {{.*}}user_declared{{.*}}
};
struct CopyConstructorHasConstParam {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyConstructorHasConstParam definition
// CHECK: CopyConstructor {{.*}}has_const_param{{.*}}
CopyConstructorHasConstParam(const CopyConstructorHasConstParam&) {}
};
struct CopyConstructorDoesNotHaveConstParam {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyConstructorDoesNotHaveConstParam definition
// CHECK-NOT: CopyConstructor {{.*}} has_const_param{{.*}}
CopyConstructorDoesNotHaveConstParam(CopyConstructorDoesNotHaveConstParam&) {}
};
struct NeedsImplicitCopyConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitCopyConstructor definition
// CHECK: CopyConstructor {{.*}}needs_implicit{{.*}}
int i = 12;
};
struct DoesNotNeedImplicitCopyConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> 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]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct CopyConstructorNeedsOverloadResolution definition
// CHECK: CopyConstructor {{.*}}needs_overload_resolution{{.*}}
};
struct CopyConstructorDoesNotNeedOverloadResolution {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct CopyConstructorDoesNotNeedOverloadResolution definition
// CHECK-NOT: CopyConstructor {{.*}}needs_overload_resolution{{.*}}
};
struct DefaultedCopyConstructorIsDeleted {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+4]]:1> 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]]:1, line:[[@LINE+4]]:1> 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]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct ImplicitCopyConstructorHasConstParam definition
// CHECK: CopyConstructor {{.*}}implicit_has_const_param{{.*}}
};
struct ImplicitCopyConstructorDoesNotHaveConstParam : BaseWithoutCopyConstructorConstParam {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct ImplicitCopyConstructorDoesNotHaveConstParam definition
// CHECK-NOT: CopyConstructor {{.*}}implicit_has_const_param{{.*}}
};
struct MoveConstructorExists {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveConstructorExists definition
// CHECK: MoveConstructor {{.*}}exists{{.*}}
};
struct MoveConstructorDoesNotExist {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct MoveConstructorDoesNotExist definition
// CHECK-NOT: MoveConstructor {{.*}}exists{{.*}}
MoveConstructorDoesNotExist(const MoveConstructorDoesNotExist&);
};
struct SimpleMoveConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct SimpleMoveConstructor definition
// CHECK: MoveConstructor {{.*}}simple{{.*}}
int i = 12;
};
struct NotSimpleMoveConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NotSimpleMoveConstructor definition
// CHECK-NOT: MoveConstructor {{.*}}simple{{.*}}
NotSimpleMoveConstructor(NotSimpleMoveConstructor&&) = delete;
};
struct TrivialMoveConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialMoveConstructor definition
// CHECK: MoveConstructor {{.*}} trivial{{.*}}
TrivialMoveConstructor() = default;
};
struct NontrivialMoveConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialMoveConstructor definition
// CHECK: MoveConstructor {{.*}}non_trivial{{.*}}
NontrivialMoveConstructor(NontrivialMoveConstructor&&) {}
};
struct UserDeclaredMoveConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredMoveConstructor definition
// CHECK: MoveConstructor {{.*}}user_declared{{.*}}
UserDeclaredMoveConstructor(UserDeclaredMoveConstructor&&) {}
};
struct NonUserDeclaredMoveConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredMoveConstructor definition
// CHECK-NOT: MoveConstructor {{.*}}user_declared{{.*}}
};
struct NeedsImplicitMoveConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitMoveConstructor definition
// CHECK: MoveConstructor {{.*}}needs_implicit{{.*}}
int i = 12;
};
struct DoesNotNeedImplicitMoveConstructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitMoveConstructor definition
// CHECK-NOT: MoveConstructor {{.*}}needs_implicit{{.*}}
DoesNotNeedImplicitMoveConstructor(DoesNotNeedImplicitMoveConstructor&&) {}
};
struct MoveConstructorNeedsOverloadResolution : virtual DeletedDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveConstructorNeedsOverloadResolution definition
// CHECK: MoveConstructor {{.*}}needs_overload_resolution{{.*}}
};
struct MoveConstructorDoesNotNeedOverloadResolution {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> 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]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialCopyAssignment definition
// CHECK: CopyAssignment {{.*}} trivial{{.*}}
TrivialCopyAssignment& operator=(const TrivialCopyAssignment&) = default;
};
struct NontrivialCopyAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialCopyAssignment definition
// CHECK: CopyAssignment {{.*}}non_trivial{{.*}}
NontrivialCopyAssignment& operator=(const NontrivialCopyAssignment&) {}
};
struct CopyAssignmentHasConstParam {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyAssignmentHasConstParam definition
// CHECK: CopyAssignment {{.*}}has_const_param{{.*}}
CopyAssignmentHasConstParam& operator=(const CopyAssignmentHasConstParam&) {}
};
struct CopyAssignmentDoesNotHaveConstParam {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyAssignmentDoesNotHaveConstParam definition
// CHECK-NOT: CopyAssignment {{.*}} has_const_param{{.*}}
CopyAssignmentDoesNotHaveConstParam& operator=(CopyAssignmentDoesNotHaveConstParam&) {}
};
struct UserDeclaredCopyAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredCopyAssignment definition
// CHECK: CopyAssignment {{.*}}user_declared{{.*}}
UserDeclaredCopyAssignment& operator=(const UserDeclaredCopyAssignment&) {}
};
struct NonUserDeclaredCopyAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredCopyAssignment definition
// CHECK-NOT: CopyAssignment {{.*}}user_declared{{.*}}
};
struct NeedsImplicitCopyAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitCopyAssignment definition
// CHECK: CopyAssignment {{.*}}needs_implicit{{.*}}
int i = 12;
};
struct DoesNotNeedImplicitCopyAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitCopyAssignment definition
// CHECK-NOT: CopyAssignment {{.*}}needs_implicit{{.*}}
DoesNotNeedImplicitCopyAssignment& operator=(const DoesNotNeedImplicitCopyAssignment&) {}
};
struct CopyAssignmentNeedsOverloadResolution {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyAssignmentNeedsOverloadResolution definition
// CHECK: CopyAssignment {{.*}}needs_overload_resolution{{.*}}
mutable int i;
};
struct CopyAssignmentDoesNotNeedOverloadResolution {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> 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]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct ImplicitCopyAssignmentHasConstParam definition
// CHECK: CopyAssignment {{.*}}implicit_has_const_param{{.*}}
};
struct ImplicitCopyAssignmentDoesNotHaveConstParam : BaseWithoutCopyAssignmentConstParam {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct ImplicitCopyAssignmentDoesNotHaveConstParam definition
// CHECK-NOT: CopyAssignment {{.*}}implicit_has_const_param{{.*}}
};
struct MoveAssignmentExists {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveAssignmentExists definition
// CHECK: MoveAssignment {{.*}}exists{{.*}}
};
struct MoveAssignmentDoesNotExist {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct MoveAssignmentDoesNotExist definition
// CHECK-NOT: MoveAssignment {{.*}}exists{{.*}}
MoveAssignmentDoesNotExist& operator=(const MoveAssignmentDoesNotExist&);
};
struct SimpleMoveAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct SimpleMoveAssignment definition
// CHECK: MoveAssignment {{.*}}simple{{.*}}
int i = 12;
};
struct NotSimpleMoveAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NotSimpleMoveAssignment definition
// CHECK-NOT: MoveAssignment {{.*}}simple{{.*}}
NotSimpleMoveAssignment& operator=(NotSimpleMoveAssignment&&) = delete;
};
struct TrivialMoveAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialMoveAssignment definition
// CHECK: MoveAssignment {{.*}} trivial{{.*}}
TrivialMoveAssignment() = default;
};
struct NontrivialMoveAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialMoveAssignment definition
// CHECK: MoveAssignment {{.*}}non_trivial{{.*}}
NontrivialMoveAssignment& operator=(NontrivialMoveAssignment&&) {}
};
struct UserDeclaredMoveAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredMoveAssignment definition
// CHECK: MoveAssignment {{.*}}user_declared{{.*}}
UserDeclaredMoveAssignment& operator=(UserDeclaredMoveAssignment&&) {}
};
struct NonUserDeclaredMoveAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredMoveAssignment definition
// CHECK-NOT: MoveAssignment {{.*}}user_declared{{.*}}
};
struct NeedsImplicitMoveAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitMoveAssignment definition
// CHECK: MoveAssignment {{.*}}needs_implicit{{.*}}
int i = 12;
};
struct DoesNotNeedImplicitMoveAssignment {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> 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]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveAssignmentNeedsOverloadResolution definition
// CHECK: MoveAssignment {{.*}}needs_overload_resolution{{.*}}
};
struct MoveAssignmentDoesNotNeedOverloadResolution {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveAssignmentDoesNotNeedOverloadResolution definition
// CHECK-NOT: MoveAssignment {{.*}}needs_overload_resolution{{.*}}
};
struct SimpleDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct SimpleDestructor definition
// CHECK: Destructor {{.*}}simple{{.*}}
};
struct NotSimpleDestructor : DeletedDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NotSimpleDestructor definition
// CHECK-NOT: Destructor {{.*}}simple{{.*}}
};
struct IrrelevantDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct IrrelevantDestructor definition
// CHECK: Destructor {{.*}}irrelevant{{.*}}
};
struct RelevantDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct RelevantDestructor definition
// CHECK-NOT: Destructor {{.*}}irrelevant{{.*}}
~RelevantDestructor() {}
};
struct TrivialDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialDestructor definition
// CHECK: Destructor {{.*}} trivial{{.*}}
~TrivialDestructor() = default;
};
struct NontrivialDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialDestructor definition
// CHECK: Destructor {{.*}}non_trivial{{.*}}
~NontrivialDestructor() {}
};
struct UserDeclaredDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredDestructor definition
// CHECK: Destructor {{.*}}user_declared{{.*}}
~UserDeclaredDestructor() {}
};
struct NonUserDeclaredDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredDestructor definition
// CHECK-NOT: Destructor {{.*}}user_declared{{.*}}
};
struct NeedsImplicitDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitDestructor definition
// CHECK: Destructor {{.*}}needs_implicit{{.*}}
int i = 12;
};
struct DoesNotNeedImplicitDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitDestructor definition
// CHECK-NOT: Destructor {{.*}}needs_implicit{{.*}}
~DoesNotNeedImplicitDestructor() {}
};
struct DestructorNeedsOverloadResolution : virtual DeletedDestructor {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DestructorNeedsOverloadResolution definition
// CHECK: Destructor {{.*}}needs_overload_resolution{{.*}}
~DestructorNeedsOverloadResolution();
};
struct DestructorDoesNotNeedOverloadResolution {
// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct DestructorDoesNotNeedOverloadResolution definition
// CHECK-NOT: Destructor {{.*}}needs_overload_resolution{{.*}}
};
// FIXME: defaulted_is_deleted