1 // (C) Copyright 2009 Robert Ramey
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 // See http://www.boost.org for most recent version including documentation.
7
8 // note: this is a compile only test.
9 #include <sstream>
10 #include <boost/config.hpp> // BOOST_STATIC_CONST
11
12 #include <boost/serialization/static_warning.hpp>
13 #include <boost/serialization/tracking.hpp>
14 #include <boost/serialization/level.hpp>
15 #include <boost/serialization/version.hpp>
16 #include <boost/serialization/nvp.hpp>
17
18 #include <boost/archive/text_iarchive.hpp>
19 #include <boost/archive/text_oarchive.hpp>
20
21 // track_selectivly with class information in the archive
22 // is unsafe when used with a pointer and should trigger a warning
23 struct check1 {
24 template<class Archive>
25 void serialize(Archive & ar, const unsigned int version);
check1check126 check1(){}
27 };
28
29 BOOST_CLASS_IMPLEMENTATION(check1, boost::serialization::object_serializable)
30 BOOST_CLASS_TRACKING(check1, boost::serialization::track_selectively)
31
32 // the combination of versioning + no class information
33 // should trigger a warning
34 struct check2 {
35 template<class Archive>
36 void serialize(Archive & ar, const unsigned int version);
check2check237 check2(){}
38 };
39
40 BOOST_CLASS_IMPLEMENTATION(check2, boost::serialization::object_serializable)
41 BOOST_CLASS_VERSION(check2, 1)
42 // use track always to turn off warning tested above
43 BOOST_CLASS_TRACKING(check2, boost::serialization::track_always)
44
45 // serializing a type marked as "track_never" through a pointer
46 // is likely an error
47 struct check3 {
48 template<class Archive>
49 void serialize(Archive & ar, const unsigned int version);
check3check350 check3(){}
51 };
52
BOOST_CLASS_TRACKING(check3,boost::serialization::track_never)53 BOOST_CLASS_TRACKING(check3, boost::serialization::track_never)
54
55 template<class T>
56 int f(){
57 BOOST_STATIC_WARNING(T::value);
58 BOOST_STATIC_ASSERT(T::value);
59 return 0;
60 }
61
62 /////////////////////////////////////////////////////////////////////////
63 // compilation of this program should show a total of 10 warning messages
main(int,char * [])64 int main(int /* argc */, char * /* argv */[]){
65 std::stringstream s;
66 {
67 boost::archive::text_oarchive oa(s);
68
69 check1 const c1_out;
70 oa << c1_out;
71
72 check1 c1_non_const_out;
73 oa << c1_non_const_out; // warn check_object_tracking
74
75 check1 * const c1_ptr_out = 0;
76 oa << c1_ptr_out; // warn check_pointer_level
77
78 check2 const * c2_ptr_out;
79 oa << c2_ptr_out; // error check_object_versioning
80
81 check3 * const c3_ptr_out = 0;
82 oa << c3_ptr_out; // warning check_pointer_tracking
83
84 check2 const c2_out;
85 oa << c2_out; // error check_object_versioning
86 }
87 {
88 boost::archive::text_iarchive ia(s);
89
90 check1 const c1_in;
91 ia >> c1_in; // check_const_loading
92
93 check1 * c1_ptr_in = 0;
94 ia >> c1_ptr_in; // warn check_pointer_level
95
96 check2 * c2_ptr_in;
97 ia >> c2_ptr_in; // error check_object_versioning
98
99 check3 * c3_ptr_in = 0;
100 ia >> c3_ptr_in; // warning check_pointer_tracking
101
102 check2 c2_in;
103 ia >> c2_in; // error check_object_versioning
104 }
105 {
106 boost::archive::text_oarchive oa(s);
107
108 check1 const c1_out;
109 oa << BOOST_SERIALIZATION_NVP(c1_out);
110
111 check1 c1_non_const_out;
112 oa << BOOST_SERIALIZATION_NVP(c1_non_const_out); // warn check_object_tracking
113
114 check1 * const c1_ptr_out = 0;
115 oa << BOOST_SERIALIZATION_NVP(c1_ptr_out); // warn check_pointer_level
116
117 check2 const * c2_ptr_out;
118 oa << BOOST_SERIALIZATION_NVP(c2_ptr_out); // error check_object_versioning
119
120 check3 * const c3_ptr_out = 0;
121 oa << BOOST_SERIALIZATION_NVP(c3_ptr_out); // warning check_pointer_tracking
122
123 check2 const c2_out;
124 oa << BOOST_SERIALIZATION_NVP(c2_out); // error check_object_versioning
125 }
126 {
127 boost::archive::text_iarchive ia(s);
128
129 check1 const c1_in;
130 ia >> BOOST_SERIALIZATION_NVP(c1_in); // check_const_loading
131
132 check1 * c1_ptr_in = 0;
133 ia >> BOOST_SERIALIZATION_NVP(c1_ptr_in); // warn check_pointer_level
134
135 check2 * c2_ptr_in;
136 ia >> BOOST_SERIALIZATION_NVP(c2_ptr_in); // error check_object_versioning
137
138 check3 * c3_ptr_in = 0;
139 ia >> BOOST_SERIALIZATION_NVP(c3_ptr_in); // warning check_pointer_tracking
140
141 check2 c2_in;
142 ia >> BOOST_SERIALIZATION_NVP(c2_in); // error check_object_versioning
143 }
144 return 0;
145 }
146