From 1311f5d3bfb6613944df9c056dff0303442d3a84 Mon Sep 17 00:00:00 2001 From: Niels Dekker Date: Thu, 13 May 2010 12:11:58 +0000 Subject: [PATCH] Added value-initialization checks for pointer-to-member. [SVN r61942] --- test/boost_no_com_value_init.ipp | 42 +++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/test/boost_no_com_value_init.ipp b/test/boost_no_com_value_init.ipp index e62069bb..53a8e6e5 100644 --- a/test/boost_no_com_value_init.ipp +++ b/test/boost_no_com_value_init.ipp @@ -13,7 +13,7 @@ #include // This test checks various forms of value-initialization: -// - doing member initialization inside a constructor +// - doing subobject initialization inside a constructor // - creating a temporary object by T() // - creating a heap object by doing new T() // It checks various DefaultConstructible types, including fundamental types, @@ -138,6 +138,24 @@ namespace boost_no_complete_value_initialization return arg.data == 0; } + struct int_pair_struct + { + int first; + int second; + }; + + typedef int int_pair_struct::*ptr_to_member_type; + + struct ptr_to_member_struct + { + ptr_to_member_type data; + }; + + bool is_value_initialized(const ptr_to_member_struct& arg) + { + return arg.data == 0; + } + // A struct, having an int. Equivalent to the struct TData, from CodeGear bug // report 51854, "Value-initialization: POD struct should be zero-initialized", // reported by me (Niels Dekker, LKEB) in 2007: @@ -432,7 +450,7 @@ namespace boost_no_complete_value_initialization - // For built-in types and enumerated types. + // Tells whether an object of a scalar type T is value-initialized. template bool is_value_initialized(const T& arg) { @@ -547,6 +565,10 @@ namespace boost_no_complete_value_initialization member_function_ptr_type m_member_function_ptr_array[2]; member_function_ptr_struct m_member_function_ptr_struct; member_function_ptr_struct m_member_function_ptr_struct_array[2]; + ptr_to_member_type m_ptr_to_member; + ptr_to_member_type m_ptr_to_member_array[2]; + ptr_to_member_struct m_ptr_to_member_struct; + ptr_to_member_struct m_ptr_to_member_struct_array[2]; bit_field_struct m_bit_field_struct; bit_field_struct m_bit_field_struct_array[2]; int_struct m_int_struct; @@ -635,6 +657,10 @@ namespace boost_no_complete_value_initialization m_member_function_ptr_array(), m_member_function_ptr_struct(), m_member_function_ptr_struct_array(), + m_ptr_to_member(), + m_ptr_to_member_array(), + m_ptr_to_member_struct(), + m_ptr_to_member_struct_array(), m_bit_field_struct(), m_bit_field_struct_array(), m_int_struct(), @@ -732,6 +758,12 @@ namespace boost_no_complete_value_initialization FAILED_TO_VALUE_INITIALIZE(m_member_function_ptr_struct) + FAILED_TO_VALUE_INITIALIZE(m_member_function_ptr_struct_array[0]) + FAILED_TO_VALUE_INITIALIZE(m_member_function_ptr_struct_array[1]) + + FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member) + + FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_array[0]) + + FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_array[1]) + + FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_struct) + + FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_struct_array[0]) + + FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_struct_array[1]) + FAILED_TO_VALUE_INITIALIZE(m_bit_field_struct) + FAILED_TO_VALUE_INITIALIZE(m_bit_field_struct_array[0]) + FAILED_TO_VALUE_INITIALIZE(m_bit_field_struct_array[1]) + @@ -817,6 +849,8 @@ namespace boost_no_complete_value_initialization FAILED_TO_VALUE_INITIALIZE(function_ptr_struct()) + FAILED_TO_VALUE_INITIALIZE(member_function_ptr_type()) + FAILED_TO_VALUE_INITIALIZE(member_function_ptr_struct()) + + FAILED_TO_VALUE_INITIALIZE(ptr_to_member_type()) + + FAILED_TO_VALUE_INITIALIZE(ptr_to_member_struct()) + FAILED_TO_VALUE_INITIALIZE(int_struct()) + FAILED_TO_VALUE_INITIALIZE(int_struct_holder()) + FAILED_TO_VALUE_INITIALIZE(pod_struct()) + @@ -869,6 +903,8 @@ namespace boost_no_complete_value_initialization FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + + FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + + FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + @@ -971,7 +1007,7 @@ namespace boost_no_complete_value_initialization << num_failures_of_temporaries << '+' << num_failures_of_heap_objects << "): " << total_num_failures - << "\nDetected by boost_no_complete_value_initialization::test() revision 25." + << "\nDetected by boost_no_complete_value_initialization::test() revision 26." << std::endl; } return static_cast(total_num_failures);