forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			447 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			447 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
	
// 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
 |