Skip to content

Commit

Permalink
Move compile test to separate source file
Browse files Browse the repository at this point in the history
  • Loading branch information
glenfe committed Jul 14, 2024
1 parent bda05a7 commit 76061d9
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 34 deletions.
1 change: 1 addition & 0 deletions test/Jamfile.v2
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ run empty_value_test.cpp ;
run empty_value_size_test.cpp ;
run empty_value_final_test.cpp ;
run empty_value_constexpr_test.cpp ;
compile empty_value_nested_test.cpp ;
compile-fail empty_value_compile_fail_casting.cpp ;

run quick_exit_test.cpp ;
Expand Down
45 changes: 45 additions & 0 deletions test/empty_value_nested_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
Copyright 2024 Braden Ganetsky
([email protected])
Distributed under the Boost Software License, Version 1.0.
(http://www.boost.org/LICENSE_1_0.txt)
*/
#include <boost/core/empty_value.hpp>

/*
Tests workaround for MSVC bug:
https://developercommunity.visualstudio.com/t/Compiler-bug:-Incorrect-C2247-and-C2248/10690025
*/
template<class T>
struct derived
: boost::empty_value<T> {
typedef typename boost::empty_value<T>::type type;
derived(boost::empty_init_t e)
: boost::empty_value<T>(e) { }
};

struct outer {
struct inner_empty { };
struct inner_non_empty {
inner_non_empty()
: value() { }
int value;
};
};

void test()
{
const boost::empty_value<outer> x1(boost::empty_init);
(void)x1;
const boost::empty_value<outer::inner_empty> x2(boost::empty_init);
(void)x2;
const boost::empty_value<outer::inner_non_empty> x3(boost::empty_init);
(void)x3;
const derived<outer> x4(boost::empty_init);
(void)x4;
const derived<outer::inner_empty> x5(boost::empty_init);
(void)x5;
const derived<outer::inner_non_empty> x6(boost::empty_init);
(void)x6;
}
34 changes: 0 additions & 34 deletions test/empty_value_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,40 +63,6 @@ void test_type()
BOOST_TEST(v2.get().value() == 6);
}

template <class T>
struct derived : boost::empty_value<T> {
typedef typename boost::empty_value<T>::type type;
derived(boost::empty_init_t e) : boost::empty_value<T>(e) {}
};

struct outer {
struct inner_empty {};
struct inner_non_empty {
inner_non_empty() : value() {}
int value;
};
};

void test_derived_compile()
{
// This is testing the workaround to an MSVC bug when T is a nested class.
// See https://developercommunity.visualstudio.com/t/Compiler-bug:-Incorrect-C2247-and-C2248/10690025

const boost::empty_value<outer> x1(boost::empty_init);
const boost::empty_value<outer::inner_empty> x2(boost::empty_init);
const boost::empty_value<outer::inner_non_empty> x3(boost::empty_init);
const derived<outer> x4(boost::empty_init);
const derived<outer::inner_empty> x5(boost::empty_init);
const derived<outer::inner_non_empty> x6(boost::empty_init);

(void)x1;
(void)x2;
(void)x3;
(void)x4;
(void)x5;
(void)x6;
}

int main()
{
test_int();
Expand Down

0 comments on commit 76061d9

Please sign in to comment.