variant_test.cc 88 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614
  1. // Copyright 2017 The Abseil Authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // Unit tests for the variant template. The 'is' and 'IsEmpty' methods
  15. // of variant are not explicitly tested because they are used repeatedly
  16. // in building other tests. All other public variant methods should have
  17. // explicit tests.
  18. #include "absl/types/variant.h"
  19. #include <algorithm>
  20. #include <cstddef>
  21. #include <functional>
  22. #include <initializer_list>
  23. #include <memory>
  24. #include <ostream>
  25. #include <queue>
  26. #include <type_traits>
  27. #include <unordered_set>
  28. #include <utility>
  29. #include <vector>
  30. #include "gmock/gmock.h"
  31. #include "gtest/gtest.h"
  32. #include "absl/base/config.h"
  33. #include "absl/base/port.h"
  34. #include "absl/memory/memory.h"
  35. #include "absl/meta/type_traits.h"
  36. #include "absl/strings/string_view.h"
  37. #ifdef ABSL_HAVE_EXCEPTIONS
  38. #define ABSL_VARIANT_TEST_EXPECT_FAIL(expr, exception_t, text) \
  39. EXPECT_THROW(expr, exception_t)
  40. #else
  41. #define ABSL_VARIANT_TEST_EXPECT_FAIL(expr, exception_t, text) \
  42. EXPECT_DEATH(expr, text)
  43. #endif // ABSL_HAVE_EXCEPTIONS
  44. #define ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(...) \
  45. ABSL_VARIANT_TEST_EXPECT_FAIL((__VA_ARGS__), absl::bad_variant_access, \
  46. "Bad variant access")
  47. struct Hashable {};
  48. namespace std {
  49. template <>
  50. struct hash<Hashable> {
  51. size_t operator()(const Hashable&);
  52. };
  53. } // namespace std
  54. struct NonHashable {};
  55. namespace absl {
  56. inline namespace lts_2018_06_20 {
  57. namespace {
  58. using ::testing::DoubleEq;
  59. using ::testing::Pointee;
  60. using ::testing::VariantWith;
  61. struct MoveCanThrow {
  62. MoveCanThrow() : v(0) {}
  63. MoveCanThrow(int v) : v(v) {} // NOLINT(runtime/explicit)
  64. MoveCanThrow(const MoveCanThrow& other) : v(other.v) {}
  65. MoveCanThrow& operator=(const MoveCanThrow& /*other*/) { return *this; }
  66. int v;
  67. };
  68. bool operator==(MoveCanThrow lhs, MoveCanThrow rhs) { return lhs.v == rhs.v; }
  69. bool operator!=(MoveCanThrow lhs, MoveCanThrow rhs) { return lhs.v != rhs.v; }
  70. bool operator<(MoveCanThrow lhs, MoveCanThrow rhs) { return lhs.v < rhs.v; }
  71. bool operator<=(MoveCanThrow lhs, MoveCanThrow rhs) { return lhs.v <= rhs.v; }
  72. bool operator>=(MoveCanThrow lhs, MoveCanThrow rhs) { return lhs.v >= rhs.v; }
  73. bool operator>(MoveCanThrow lhs, MoveCanThrow rhs) { return lhs.v > rhs.v; }
  74. // This helper class allows us to determine if it was swapped with std::swap()
  75. // or with its friend swap() function.
  76. struct SpecialSwap {
  77. explicit SpecialSwap(int i) : i(i) {}
  78. friend void swap(SpecialSwap& a, SpecialSwap& b) {
  79. a.special_swap = b.special_swap = true;
  80. std::swap(a.i, b.i);
  81. }
  82. bool operator==(SpecialSwap other) const { return i == other.i; }
  83. int i;
  84. bool special_swap = false;
  85. };
  86. struct MoveOnlyWithListConstructor {
  87. MoveOnlyWithListConstructor() = default;
  88. explicit MoveOnlyWithListConstructor(std::initializer_list<int> /*ilist*/,
  89. int value)
  90. : value(value) {}
  91. MoveOnlyWithListConstructor(MoveOnlyWithListConstructor&&) = default;
  92. MoveOnlyWithListConstructor& operator=(MoveOnlyWithListConstructor&&) =
  93. default;
  94. int value = 0;
  95. };
  96. #ifdef ABSL_HAVE_EXCEPTIONS
  97. struct ConversionException {};
  98. template <class T>
  99. struct ExceptionOnConversion {
  100. operator T() const { // NOLINT(runtime/explicit)
  101. throw ConversionException();
  102. }
  103. };
  104. // Forces a variant into the valueless by exception state.
  105. template <class H, class... T>
  106. void ToValuelessByException(absl::variant<H, T...>& v) { // NOLINT
  107. try {
  108. v.template emplace<0>(ExceptionOnConversion<H>());
  109. } catch (ConversionException& /*e*/) {
  110. // This space intentionally left blank.
  111. }
  112. }
  113. #endif // ABSL_HAVE_EXCEPTIONS
  114. // An indexed sequence of distinct structures holding a single
  115. // value of type T
  116. template<typename T, size_t N>
  117. struct ValueHolder {
  118. explicit ValueHolder(const T& x) : value(x) {}
  119. typedef T value_type;
  120. value_type value;
  121. static const size_t kIndex = N;
  122. };
  123. template<typename T, size_t N>
  124. const size_t ValueHolder<T, N>::kIndex;
  125. // The following three functions make ValueHolder compatible with
  126. // EXPECT_EQ and EXPECT_NE
  127. template<typename T, size_t N>
  128. inline bool operator==(const ValueHolder<T, N>& left,
  129. const ValueHolder<T, N>& right) {
  130. return left.value == right.value;
  131. }
  132. template<typename T, size_t N>
  133. inline bool operator!=(const ValueHolder<T, N>& left,
  134. const ValueHolder<T, N>& right) {
  135. return left.value != right.value;
  136. }
  137. template<typename T, size_t N>
  138. inline std::ostream& operator<<(
  139. std::ostream& stream, const ValueHolder<T, N>& object) {
  140. return stream << object.value;
  141. }
  142. // Makes a variant holding twelve uniquely typed T wrappers.
  143. template<typename T>
  144. struct VariantFactory {
  145. typedef variant<ValueHolder<T, 1>, ValueHolder<T, 2>, ValueHolder<T, 3>,
  146. ValueHolder<T, 4>>
  147. Type;
  148. };
  149. // A typelist in 1:1 with VariantFactory, to use type driven unit tests.
  150. typedef ::testing::Types<ValueHolder<size_t, 1>, ValueHolder<size_t, 2>,
  151. ValueHolder<size_t, 3>,
  152. ValueHolder<size_t, 4>> VariantTypes;
  153. // Increments the provided counter pointer in the destructor
  154. struct IncrementInDtor {
  155. explicit IncrementInDtor(int* counter) : counter(counter) {}
  156. ~IncrementInDtor() { *counter += 1; }
  157. int* counter;
  158. };
  159. struct IncrementInDtorCopyCanThrow {
  160. explicit IncrementInDtorCopyCanThrow(int* counter) : counter(counter) {}
  161. IncrementInDtorCopyCanThrow(IncrementInDtorCopyCanThrow&& other) noexcept =
  162. default;
  163. IncrementInDtorCopyCanThrow(const IncrementInDtorCopyCanThrow& other)
  164. : counter(other.counter) {}
  165. IncrementInDtorCopyCanThrow& operator=(
  166. IncrementInDtorCopyCanThrow&&) noexcept = default;
  167. IncrementInDtorCopyCanThrow& operator=(
  168. IncrementInDtorCopyCanThrow const& other) {
  169. counter = other.counter;
  170. return *this;
  171. }
  172. ~IncrementInDtorCopyCanThrow() { *counter += 1; }
  173. int* counter;
  174. };
  175. // This is defined so operator== for ValueHolder<IncrementInDtor> will
  176. // return true if two IncrementInDtor objects increment the same
  177. // counter
  178. inline bool operator==(const IncrementInDtor& left,
  179. const IncrementInDtor& right) {
  180. return left.counter == right.counter;
  181. }
  182. // This is defined so EXPECT_EQ can work with IncrementInDtor
  183. inline std::ostream& operator<<(
  184. std::ostream& stream, const IncrementInDtor& object) {
  185. return stream << object.counter;
  186. }
  187. // A class that can be copied, but not assigned.
  188. class CopyNoAssign {
  189. public:
  190. explicit CopyNoAssign(int value) : foo(value) {}
  191. CopyNoAssign(const CopyNoAssign& other) : foo(other.foo) {}
  192. int foo;
  193. private:
  194. const CopyNoAssign& operator=(const CopyNoAssign&);
  195. };
  196. // A class that can neither be copied nor assigned. We provide
  197. // overloads for the constructor with up to four parameters so we can
  198. // test the overloads of variant::emplace.
  199. class NonCopyable {
  200. public:
  201. NonCopyable()
  202. : value(0) {}
  203. explicit NonCopyable(int value1)
  204. : value(value1) {}
  205. NonCopyable(int value1, int value2)
  206. : value(value1 + value2) {}
  207. NonCopyable(int value1, int value2, int value3)
  208. : value(value1 + value2 + value3) {}
  209. NonCopyable(int value1, int value2, int value3, int value4)
  210. : value(value1 + value2 + value3 + value4) {}
  211. NonCopyable(const NonCopyable&) = delete;
  212. NonCopyable& operator=(const NonCopyable&) = delete;
  213. int value;
  214. };
  215. // A typed test and typed test case over the VariantTypes typelist,
  216. // from which we derive a number of tests that will execute for one of
  217. // each type.
  218. template <typename T>
  219. class VariantTypesTest : public ::testing::Test {};
  220. TYPED_TEST_CASE(VariantTypesTest, VariantTypes);
  221. ////////////////////
  222. // [variant.ctor] //
  223. ////////////////////
  224. struct NonNoexceptDefaultConstructible {
  225. NonNoexceptDefaultConstructible() {}
  226. int value = 5;
  227. };
  228. struct NonDefaultConstructible {
  229. NonDefaultConstructible() = delete;
  230. };
  231. TEST(VariantTest, TestDefaultConstructor) {
  232. {
  233. using X = variant<int>;
  234. constexpr variant<int> x{};
  235. ASSERT_FALSE(x.valueless_by_exception());
  236. ASSERT_EQ(0, x.index());
  237. EXPECT_EQ(0, absl::get<0>(x));
  238. EXPECT_TRUE(std::is_nothrow_default_constructible<X>::value);
  239. }
  240. {
  241. using X = variant<NonNoexceptDefaultConstructible>;
  242. X x{};
  243. ASSERT_FALSE(x.valueless_by_exception());
  244. ASSERT_EQ(0, x.index());
  245. EXPECT_EQ(5, absl::get<0>(x).value);
  246. EXPECT_FALSE(std::is_nothrow_default_constructible<X>::value);
  247. }
  248. {
  249. using X = variant<int, NonNoexceptDefaultConstructible>;
  250. X x{};
  251. ASSERT_FALSE(x.valueless_by_exception());
  252. ASSERT_EQ(0, x.index());
  253. EXPECT_EQ(0, absl::get<0>(x));
  254. EXPECT_TRUE(std::is_nothrow_default_constructible<X>::value);
  255. }
  256. {
  257. using X = variant<NonNoexceptDefaultConstructible, int>;
  258. X x{};
  259. ASSERT_FALSE(x.valueless_by_exception());
  260. ASSERT_EQ(0, x.index());
  261. EXPECT_EQ(5, absl::get<0>(x).value);
  262. EXPECT_FALSE(std::is_nothrow_default_constructible<X>::value);
  263. }
  264. EXPECT_FALSE(
  265. std::is_default_constructible<variant<NonDefaultConstructible>>::value);
  266. EXPECT_FALSE((std::is_default_constructible<
  267. variant<NonDefaultConstructible, int>>::value));
  268. EXPECT_TRUE((std::is_default_constructible<
  269. variant<int, NonDefaultConstructible>>::value));
  270. }
  271. // Test that for each slot, copy constructing a variant with that type
  272. // produces a sensible object that correctly reports its type, and
  273. // that copies the provided value.
  274. TYPED_TEST(VariantTypesTest, TestCopyCtor) {
  275. typedef typename VariantFactory<typename TypeParam::value_type>::Type Variant;
  276. using value_type1 = absl::variant_alternative_t<0, Variant>;
  277. using value_type2 = absl::variant_alternative_t<1, Variant>;
  278. using value_type3 = absl::variant_alternative_t<2, Variant>;
  279. using value_type4 = absl::variant_alternative_t<3, Variant>;
  280. const TypeParam value(TypeParam::kIndex);
  281. Variant original(value);
  282. Variant copied(original);
  283. EXPECT_TRUE(absl::holds_alternative<value_type1>(copied) ||
  284. TypeParam::kIndex != 1);
  285. EXPECT_TRUE(absl::holds_alternative<value_type2>(copied) ||
  286. TypeParam::kIndex != 2);
  287. EXPECT_TRUE(absl::holds_alternative<value_type3>(copied) ||
  288. TypeParam::kIndex != 3);
  289. EXPECT_TRUE(absl::holds_alternative<value_type4>(copied) ||
  290. TypeParam::kIndex != 4);
  291. EXPECT_TRUE((absl::get_if<value_type1>(&original) ==
  292. absl::get_if<value_type1>(&copied)) ||
  293. TypeParam::kIndex == 1);
  294. EXPECT_TRUE((absl::get_if<value_type2>(&original) ==
  295. absl::get_if<value_type2>(&copied)) ||
  296. TypeParam::kIndex == 2);
  297. EXPECT_TRUE((absl::get_if<value_type3>(&original) ==
  298. absl::get_if<value_type3>(&copied)) ||
  299. TypeParam::kIndex == 3);
  300. EXPECT_TRUE((absl::get_if<value_type4>(&original) ==
  301. absl::get_if<value_type4>(&copied)) ||
  302. TypeParam::kIndex == 4);
  303. EXPECT_TRUE((absl::get_if<value_type1>(&original) ==
  304. absl::get_if<value_type1>(&copied)) ||
  305. TypeParam::kIndex == 1);
  306. EXPECT_TRUE((absl::get_if<value_type2>(&original) ==
  307. absl::get_if<value_type2>(&copied)) ||
  308. TypeParam::kIndex == 2);
  309. EXPECT_TRUE((absl::get_if<value_type3>(&original) ==
  310. absl::get_if<value_type3>(&copied)) ||
  311. TypeParam::kIndex == 3);
  312. EXPECT_TRUE((absl::get_if<value_type4>(&original) ==
  313. absl::get_if<value_type4>(&copied)) ||
  314. TypeParam::kIndex == 4);
  315. const TypeParam* ovalptr = absl::get_if<TypeParam>(&original);
  316. const TypeParam* cvalptr = absl::get_if<TypeParam>(&copied);
  317. ASSERT_TRUE(ovalptr != nullptr);
  318. ASSERT_TRUE(cvalptr != nullptr);
  319. EXPECT_EQ(*ovalptr, *cvalptr);
  320. TypeParam* mutable_ovalptr = absl::get_if<TypeParam>(&original);
  321. TypeParam* mutable_cvalptr = absl::get_if<TypeParam>(&copied);
  322. ASSERT_TRUE(mutable_ovalptr != nullptr);
  323. ASSERT_TRUE(mutable_cvalptr != nullptr);
  324. EXPECT_EQ(*mutable_ovalptr, *mutable_cvalptr);
  325. }
  326. template <class>
  327. struct MoveOnly {
  328. MoveOnly() = default;
  329. explicit MoveOnly(int value) : value(value) {}
  330. MoveOnly(MoveOnly&&) = default;
  331. MoveOnly& operator=(MoveOnly&&) = default;
  332. int value = 5;
  333. };
  334. TEST(VariantTest, TestMoveConstruct) {
  335. using V = variant<MoveOnly<class A>, MoveOnly<class B>, MoveOnly<class C>>;
  336. V v(in_place_index_t<1>{}, 10);
  337. V v2 = absl::move(v);
  338. EXPECT_EQ(10, absl::get<1>(v2).value);
  339. }
  340. // Used internally to emulate missing triviality traits for tests.
  341. template <class T>
  342. union SingleUnion {
  343. T member;
  344. };
  345. // NOTE: These don't work with types that can't be union members.
  346. // They are just for testing.
  347. template <class T>
  348. struct is_trivially_move_constructible
  349. : std::is_move_constructible<SingleUnion<T>>::type {};
  350. template <class T>
  351. struct is_trivially_move_assignable
  352. : std::is_move_assignable<SingleUnion<T>>::type {};
  353. TEST(VariantTest, NothrowMoveConstructible) {
  354. // Verify that variant is nothrow move constructible iff its template
  355. // arguments are.
  356. using U = std::unique_ptr<int>;
  357. struct E {
  358. E(E&&) {}
  359. };
  360. static_assert(std::is_nothrow_move_constructible<variant<U>>::value, "");
  361. static_assert(std::is_nothrow_move_constructible<variant<U, int>>::value, "");
  362. static_assert(!std::is_nothrow_move_constructible<variant<U, E>>::value, "");
  363. }
  364. // Test that for each slot, constructing a variant with that type
  365. // produces a sensible object that correctly reports its type, and
  366. // that copies the provided value.
  367. TYPED_TEST(VariantTypesTest, TestValueCtor) {
  368. typedef typename VariantFactory<typename TypeParam::value_type>::Type Variant;
  369. using value_type1 = absl::variant_alternative_t<0, Variant>;
  370. using value_type2 = absl::variant_alternative_t<1, Variant>;
  371. using value_type3 = absl::variant_alternative_t<2, Variant>;
  372. using value_type4 = absl::variant_alternative_t<3, Variant>;
  373. const TypeParam value(TypeParam::kIndex);
  374. Variant v(value);
  375. EXPECT_TRUE(absl::holds_alternative<value_type1>(v) ||
  376. TypeParam::kIndex != 1);
  377. EXPECT_TRUE(absl::holds_alternative<value_type2>(v) ||
  378. TypeParam::kIndex != 2);
  379. EXPECT_TRUE(absl::holds_alternative<value_type3>(v) ||
  380. TypeParam::kIndex != 3);
  381. EXPECT_TRUE(absl::holds_alternative<value_type4>(v) ||
  382. TypeParam::kIndex != 4);
  383. EXPECT_TRUE(nullptr != absl::get_if<value_type1>(&v) ||
  384. TypeParam::kIndex != 1);
  385. EXPECT_TRUE(nullptr != absl::get_if<value_type2>(&v) ||
  386. TypeParam::kIndex != 2);
  387. EXPECT_TRUE(nullptr != absl::get_if<value_type3>(&v) ||
  388. TypeParam::kIndex != 3);
  389. EXPECT_TRUE(nullptr != absl::get_if<value_type4>(&v) ||
  390. TypeParam::kIndex != 4);
  391. EXPECT_TRUE(nullptr != absl::get_if<value_type1>(&v) ||
  392. TypeParam::kIndex != 1);
  393. EXPECT_TRUE(nullptr != absl::get_if<value_type2>(&v) ||
  394. TypeParam::kIndex != 2);
  395. EXPECT_TRUE(nullptr != absl::get_if<value_type3>(&v) ||
  396. TypeParam::kIndex != 3);
  397. EXPECT_TRUE(nullptr != absl::get_if<value_type4>(&v) ||
  398. TypeParam::kIndex != 4);
  399. const TypeParam* valptr = absl::get_if<TypeParam>(&v);
  400. ASSERT_TRUE(nullptr != valptr);
  401. EXPECT_EQ(value.value, valptr->value);
  402. const TypeParam* mutable_valptr = absl::get_if<TypeParam>(&v);
  403. ASSERT_TRUE(nullptr != mutable_valptr);
  404. EXPECT_EQ(value.value, mutable_valptr->value);
  405. }
  406. TEST(VariantTest, InPlaceType) {
  407. using Var = variant<int, std::string, NonCopyable, std::vector<int>>;
  408. Var v1(in_place_type_t<int>(), 7);
  409. ASSERT_TRUE(absl::holds_alternative<int>(v1));
  410. EXPECT_EQ(7, absl::get<int>(v1));
  411. Var v2(in_place_type_t<std::string>(), "ABC");
  412. ASSERT_TRUE(absl::holds_alternative<std::string>(v2));
  413. EXPECT_EQ("ABC", absl::get<std::string>(v2));
  414. Var v3(in_place_type_t<std::string>(), "ABC", 2);
  415. ASSERT_TRUE(absl::holds_alternative<std::string>(v3));
  416. EXPECT_EQ("AB", absl::get<std::string>(v3));
  417. Var v4(in_place_type_t<NonCopyable>{});
  418. ASSERT_TRUE(absl::holds_alternative<NonCopyable>(v4));
  419. Var v5(in_place_type_t<std::vector<int>>(), {1, 2, 3});
  420. ASSERT_TRUE(absl::holds_alternative<std::vector<int>>(v5));
  421. EXPECT_THAT(absl::get<std::vector<int>>(v5), ::testing::ElementsAre(1, 2, 3));
  422. }
  423. TEST(VariantTest, InPlaceTypeInitializerList) {
  424. using Var = variant<int, std::string, NonCopyable, MoveOnlyWithListConstructor>;
  425. Var v1(in_place_type_t<MoveOnlyWithListConstructor>(), {1, 2, 3, 4, 5}, 6);
  426. ASSERT_TRUE(absl::holds_alternative<MoveOnlyWithListConstructor>(v1));
  427. EXPECT_EQ(6, absl::get<MoveOnlyWithListConstructor>(v1).value);
  428. }
  429. TEST(VariantTest, InPlaceIndex) {
  430. using Var = variant<int, std::string, NonCopyable, std::vector<int>>;
  431. Var v1(in_place_index_t<0>(), 7);
  432. ASSERT_TRUE(absl::holds_alternative<int>(v1));
  433. EXPECT_EQ(7, absl::get<int>(v1));
  434. Var v2(in_place_index_t<1>(), "ABC");
  435. ASSERT_TRUE(absl::holds_alternative<std::string>(v2));
  436. EXPECT_EQ("ABC", absl::get<std::string>(v2));
  437. Var v3(in_place_index_t<1>(), "ABC", 2);
  438. ASSERT_TRUE(absl::holds_alternative<std::string>(v3));
  439. EXPECT_EQ("AB", absl::get<std::string>(v3));
  440. Var v4(in_place_index_t<2>{});
  441. EXPECT_TRUE(absl::holds_alternative<NonCopyable>(v4));
  442. // Verify that a variant with only non-copyables can still be constructed.
  443. EXPECT_TRUE(absl::holds_alternative<NonCopyable>(
  444. variant<NonCopyable>(in_place_index_t<0>{})));
  445. Var v5(in_place_index_t<3>(), {1, 2, 3});
  446. ASSERT_TRUE(absl::holds_alternative<std::vector<int>>(v5));
  447. EXPECT_THAT(absl::get<std::vector<int>>(v5), ::testing::ElementsAre(1, 2, 3));
  448. }
  449. TEST(VariantTest, InPlaceIndexInitializerList) {
  450. using Var = variant<int, std::string, NonCopyable, MoveOnlyWithListConstructor>;
  451. Var v1(in_place_index_t<3>(), {1, 2, 3, 4, 5}, 6);
  452. ASSERT_TRUE(absl::holds_alternative<MoveOnlyWithListConstructor>(v1));
  453. EXPECT_EQ(6, absl::get<MoveOnlyWithListConstructor>(v1).value);
  454. }
  455. ////////////////////
  456. // [variant.dtor] //
  457. ////////////////////
  458. // Make sure that the destructor destroys the contained value
  459. TEST(VariantTest, TestDtor) {
  460. typedef VariantFactory<IncrementInDtor>::Type Variant;
  461. using value_type1 = absl::variant_alternative_t<0, Variant>;
  462. using value_type2 = absl::variant_alternative_t<1, Variant>;
  463. using value_type3 = absl::variant_alternative_t<2, Variant>;
  464. using value_type4 = absl::variant_alternative_t<3, Variant>;
  465. int counter = 0;
  466. IncrementInDtor counter_adjuster(&counter);
  467. EXPECT_EQ(0, counter);
  468. value_type1 value1(counter_adjuster);
  469. { Variant object(value1); }
  470. EXPECT_EQ(1, counter);
  471. value_type2 value2(counter_adjuster);
  472. { Variant object(value2); }
  473. EXPECT_EQ(2, counter);
  474. value_type3 value3(counter_adjuster);
  475. { Variant object(value3); }
  476. EXPECT_EQ(3, counter);
  477. value_type4 value4(counter_adjuster);
  478. { Variant object(value4); }
  479. EXPECT_EQ(4, counter);
  480. }
  481. #ifdef ABSL_HAVE_EXCEPTIONS
  482. // Test destruction when in the valueless_by_exception state.
  483. TEST(VariantTest, TestDtorValuelessByException) {
  484. int counter = 0;
  485. IncrementInDtor counter_adjuster(&counter);
  486. {
  487. using Variant = VariantFactory<IncrementInDtor>::Type;
  488. Variant v(in_place_index_t<0>(), counter_adjuster);
  489. EXPECT_EQ(0, counter);
  490. ToValuelessByException(v);
  491. ASSERT_TRUE(v.valueless_by_exception());
  492. EXPECT_EQ(1, counter);
  493. }
  494. EXPECT_EQ(1, counter);
  495. }
  496. #endif // ABSL_HAVE_EXCEPTIONS
  497. //////////////////////
  498. // [variant.assign] //
  499. //////////////////////
  500. // Test that self-assignment doesn't destroy the current value
  501. TEST(VariantTest, TestSelfAssignment) {
  502. typedef VariantFactory<IncrementInDtor>::Type Variant;
  503. int counter = 0;
  504. IncrementInDtor counter_adjuster(&counter);
  505. absl::variant_alternative_t<0, Variant> value(counter_adjuster);
  506. Variant object(value);
  507. object.operator=(object);
  508. EXPECT_EQ(0, counter);
  509. // A std::string long enough that it's likely to defeat any inline representation
  510. // optimization.
  511. const std::string long_str(128, 'a');
  512. std::string foo = long_str;
  513. foo = *&foo;
  514. EXPECT_EQ(long_str, foo);
  515. variant<int, std::string> so = long_str;
  516. ASSERT_EQ(1, so.index());
  517. EXPECT_EQ(long_str, absl::get<1>(so));
  518. so = *&so;
  519. ASSERT_EQ(1, so.index());
  520. EXPECT_EQ(long_str, absl::get<1>(so));
  521. }
  522. // Test that assigning a variant<..., T, ...> to a variant<..., T, ...> produces
  523. // a variant<..., T, ...> with the correct value.
  524. TYPED_TEST(VariantTypesTest, TestAssignmentCopiesValueSameTypes) {
  525. typedef typename VariantFactory<typename TypeParam::value_type>::Type Variant;
  526. const TypeParam value(TypeParam::kIndex);
  527. const Variant source(value);
  528. Variant target(TypeParam(value.value + 1));
  529. ASSERT_TRUE(absl::holds_alternative<TypeParam>(source));
  530. ASSERT_TRUE(absl::holds_alternative<TypeParam>(target));
  531. ASSERT_NE(absl::get<TypeParam>(source), absl::get<TypeParam>(target));
  532. target = source;
  533. ASSERT_TRUE(absl::holds_alternative<TypeParam>(source));
  534. ASSERT_TRUE(absl::holds_alternative<TypeParam>(target));
  535. EXPECT_EQ(absl::get<TypeParam>(source), absl::get<TypeParam>(target));
  536. }
  537. // Test that assisnging a variant<..., T, ...> to a variant<1, ...>
  538. // produces a variant<..., T, ...> with the correct value.
  539. TYPED_TEST(VariantTypesTest, TestAssignmentCopiesValuesVaryingSourceType) {
  540. typedef typename VariantFactory<typename TypeParam::value_type>::Type Variant;
  541. using value_type1 = absl::variant_alternative_t<0, Variant>;
  542. const TypeParam value(TypeParam::kIndex);
  543. const Variant source(value);
  544. ASSERT_TRUE(absl::holds_alternative<TypeParam>(source));
  545. Variant target(value_type1(1));
  546. ASSERT_TRUE(absl::holds_alternative<value_type1>(target));
  547. target = source;
  548. EXPECT_TRUE(absl::holds_alternative<TypeParam>(source));
  549. EXPECT_TRUE(absl::holds_alternative<TypeParam>(target));
  550. EXPECT_EQ(absl::get<TypeParam>(source), absl::get<TypeParam>(target));
  551. }
  552. // Test that assigning a variant<1, ...> to a variant<..., T, ...>
  553. // produces a variant<1, ...> with the correct value.
  554. TYPED_TEST(VariantTypesTest, TestAssignmentCopiesValuesVaryingTargetType) {
  555. typedef typename VariantFactory<typename TypeParam::value_type>::Type Variant;
  556. using value_type1 = absl::variant_alternative_t<0, Variant>;
  557. const Variant source(value_type1(1));
  558. ASSERT_TRUE(absl::holds_alternative<value_type1>(source));
  559. const TypeParam value(TypeParam::kIndex);
  560. Variant target(value);
  561. ASSERT_TRUE(absl::holds_alternative<TypeParam>(target));
  562. target = source;
  563. EXPECT_TRUE(absl::holds_alternative<value_type1>(target));
  564. EXPECT_TRUE(absl::holds_alternative<value_type1>(source));
  565. EXPECT_EQ(absl::get<value_type1>(source), absl::get<value_type1>(target));
  566. }
  567. // Test that operator=<T> works, that assigning a new value destroys
  568. // the old and that assigning the new value again does not redestroy
  569. // the old
  570. TEST(VariantTest, TestAssign) {
  571. typedef VariantFactory<IncrementInDtor>::Type Variant;
  572. using value_type1 = absl::variant_alternative_t<0, Variant>;
  573. using value_type2 = absl::variant_alternative_t<1, Variant>;
  574. using value_type3 = absl::variant_alternative_t<2, Variant>;
  575. using value_type4 = absl::variant_alternative_t<3, Variant>;
  576. const int kSize = 4;
  577. int counter[kSize];
  578. std::unique_ptr<IncrementInDtor> counter_adjustor[kSize];
  579. for (int i = 0; i != kSize; i++) {
  580. counter[i] = 0;
  581. counter_adjustor[i] = absl::make_unique<IncrementInDtor>(&counter[i]);
  582. }
  583. value_type1 v1(*counter_adjustor[0]);
  584. value_type2 v2(*counter_adjustor[1]);
  585. value_type3 v3(*counter_adjustor[2]);
  586. value_type4 v4(*counter_adjustor[3]);
  587. // Test that reassignment causes destruction of old value
  588. {
  589. Variant object(v1);
  590. object = v2;
  591. object = v3;
  592. object = v4;
  593. object = v1;
  594. }
  595. EXPECT_EQ(2, counter[0]);
  596. EXPECT_EQ(1, counter[1]);
  597. EXPECT_EQ(1, counter[2]);
  598. EXPECT_EQ(1, counter[3]);
  599. std::fill(std::begin(counter), std::end(counter), 0);
  600. // Test that self-assignment does not cause destruction of old value
  601. {
  602. Variant object(v1);
  603. object.operator=(object);
  604. EXPECT_EQ(0, counter[0]);
  605. }
  606. {
  607. Variant object(v2);
  608. object.operator=(object);
  609. EXPECT_EQ(0, counter[1]);
  610. }
  611. {
  612. Variant object(v3);
  613. object.operator=(object);
  614. EXPECT_EQ(0, counter[2]);
  615. }
  616. {
  617. Variant object(v4);
  618. object.operator=(object);
  619. EXPECT_EQ(0, counter[3]);
  620. }
  621. EXPECT_EQ(1, counter[0]);
  622. EXPECT_EQ(1, counter[1]);
  623. EXPECT_EQ(1, counter[2]);
  624. EXPECT_EQ(1, counter[3]);
  625. }
  626. // This tests that we perform a backup if the copy-assign can throw but the move
  627. // cannot throw.
  628. TEST(VariantTest, TestBackupAssign) {
  629. typedef VariantFactory<IncrementInDtorCopyCanThrow>::Type Variant;
  630. using value_type1 = absl::variant_alternative_t<0, Variant>;
  631. using value_type2 = absl::variant_alternative_t<1, Variant>;
  632. using value_type3 = absl::variant_alternative_t<2, Variant>;
  633. using value_type4 = absl::variant_alternative_t<3, Variant>;
  634. const int kSize = 4;
  635. int counter[kSize];
  636. std::unique_ptr<IncrementInDtorCopyCanThrow> counter_adjustor[kSize];
  637. for (int i = 0; i != kSize; i++) {
  638. counter[i] = 0;
  639. counter_adjustor[i].reset(new IncrementInDtorCopyCanThrow(&counter[i]));
  640. }
  641. value_type1 v1(*counter_adjustor[0]);
  642. value_type2 v2(*counter_adjustor[1]);
  643. value_type3 v3(*counter_adjustor[2]);
  644. value_type4 v4(*counter_adjustor[3]);
  645. // Test that reassignment causes destruction of old value
  646. {
  647. Variant object(v1);
  648. object = v2;
  649. object = v3;
  650. object = v4;
  651. object = v1;
  652. }
  653. // libstdc++ doesn't pass this test
  654. #if !(defined(ABSL_HAVE_STD_VARIANT) && defined(__GLIBCXX__))
  655. EXPECT_EQ(3, counter[0]);
  656. EXPECT_EQ(2, counter[1]);
  657. EXPECT_EQ(2, counter[2]);
  658. EXPECT_EQ(2, counter[3]);
  659. #endif
  660. std::fill(std::begin(counter), std::end(counter), 0);
  661. // Test that self-assignment does not cause destruction of old value
  662. {
  663. Variant object(v1);
  664. object.operator=(object);
  665. EXPECT_EQ(0, counter[0]);
  666. }
  667. {
  668. Variant object(v2);
  669. object.operator=(object);
  670. EXPECT_EQ(0, counter[1]);
  671. }
  672. {
  673. Variant object(v3);
  674. object.operator=(object);
  675. EXPECT_EQ(0, counter[2]);
  676. }
  677. {
  678. Variant object(v4);
  679. object.operator=(object);
  680. EXPECT_EQ(0, counter[3]);
  681. }
  682. EXPECT_EQ(1, counter[0]);
  683. EXPECT_EQ(1, counter[1]);
  684. EXPECT_EQ(1, counter[2]);
  685. EXPECT_EQ(1, counter[3]);
  686. }
  687. ///////////////////
  688. // [variant.mod] //
  689. ///////////////////
  690. TEST(VariantTest, TestEmplaceBasic) {
  691. using Variant = variant<int, char>;
  692. Variant v(absl::in_place_index_t<0>{}, 0);
  693. {
  694. char& emplace_result = v.emplace<char>();
  695. ASSERT_TRUE(absl::holds_alternative<char>(v));
  696. EXPECT_EQ(absl::get<char>(v), 0);
  697. EXPECT_EQ(&emplace_result, &absl::get<char>(v));
  698. }
  699. // Make sure that another emplace does zero-initialization
  700. absl::get<char>(v) = 'a';
  701. v.emplace<char>('b');
  702. ASSERT_TRUE(absl::holds_alternative<char>(v));
  703. EXPECT_EQ(absl::get<char>(v), 'b');
  704. {
  705. int& emplace_result = v.emplace<int>();
  706. EXPECT_TRUE(absl::holds_alternative<int>(v));
  707. EXPECT_EQ(absl::get<int>(v), 0);
  708. EXPECT_EQ(&emplace_result, &absl::get<int>(v));
  709. }
  710. }
  711. TEST(VariantTest, TestEmplaceInitializerList) {
  712. using Var = variant<int, std::string, NonCopyable, MoveOnlyWithListConstructor>;
  713. Var v1(absl::in_place_index_t<0>{}, 555);
  714. MoveOnlyWithListConstructor& emplace_result =
  715. v1.emplace<MoveOnlyWithListConstructor>({1, 2, 3, 4, 5}, 6);
  716. ASSERT_TRUE(absl::holds_alternative<MoveOnlyWithListConstructor>(v1));
  717. EXPECT_EQ(6, absl::get<MoveOnlyWithListConstructor>(v1).value);
  718. EXPECT_EQ(&emplace_result, &absl::get<MoveOnlyWithListConstructor>(v1));
  719. }
  720. TEST(VariantTest, TestEmplaceIndex) {
  721. using Variant = variant<int, char>;
  722. Variant v(absl::in_place_index_t<0>{}, 555);
  723. {
  724. char& emplace_result = v.emplace<1>();
  725. ASSERT_TRUE(absl::holds_alternative<char>(v));
  726. EXPECT_EQ(absl::get<char>(v), 0);
  727. EXPECT_EQ(&emplace_result, &absl::get<char>(v));
  728. }
  729. // Make sure that another emplace does zero-initialization
  730. absl::get<char>(v) = 'a';
  731. v.emplace<1>('b');
  732. ASSERT_TRUE(absl::holds_alternative<char>(v));
  733. EXPECT_EQ(absl::get<char>(v), 'b');
  734. {
  735. int& emplace_result = v.emplace<0>();
  736. EXPECT_TRUE(absl::holds_alternative<int>(v));
  737. EXPECT_EQ(absl::get<int>(v), 0);
  738. EXPECT_EQ(&emplace_result, &absl::get<int>(v));
  739. }
  740. }
  741. TEST(VariantTest, TestEmplaceIndexInitializerList) {
  742. using Var = variant<int, std::string, NonCopyable, MoveOnlyWithListConstructor>;
  743. Var v1(absl::in_place_index_t<0>{}, 555);
  744. MoveOnlyWithListConstructor& emplace_result =
  745. v1.emplace<3>({1, 2, 3, 4, 5}, 6);
  746. ASSERT_TRUE(absl::holds_alternative<MoveOnlyWithListConstructor>(v1));
  747. EXPECT_EQ(6, absl::get<MoveOnlyWithListConstructor>(v1).value);
  748. EXPECT_EQ(&emplace_result, &absl::get<MoveOnlyWithListConstructor>(v1));
  749. }
  750. //////////////////////
  751. // [variant.status] //
  752. //////////////////////
  753. TEST(VariantTest, Index) {
  754. using Var = variant<int, std::string, double>;
  755. Var v = 1;
  756. EXPECT_EQ(0, v.index());
  757. v = "str";
  758. EXPECT_EQ(1, v.index());
  759. v = 0.;
  760. EXPECT_EQ(2, v.index());
  761. Var v2 = v;
  762. EXPECT_EQ(2, v2.index());
  763. v2.emplace<int>(3);
  764. EXPECT_EQ(0, v2.index());
  765. }
  766. TEST(VariantTest, NotValuelessByException) {
  767. using Var = variant<int, std::string, double>;
  768. Var v = 1;
  769. EXPECT_FALSE(v.valueless_by_exception());
  770. v = "str";
  771. EXPECT_FALSE(v.valueless_by_exception());
  772. v = 0.;
  773. EXPECT_FALSE(v.valueless_by_exception());
  774. Var v2 = v;
  775. EXPECT_FALSE(v.valueless_by_exception());
  776. v2.emplace<int>(3);
  777. EXPECT_FALSE(v.valueless_by_exception());
  778. }
  779. #ifdef ABSL_HAVE_EXCEPTIONS
  780. TEST(VariantTest, IndexValuelessByException) {
  781. using Var = variant<MoveCanThrow, std::string, double>;
  782. Var v(absl::in_place_index_t<0>{});
  783. EXPECT_EQ(0, v.index());
  784. ToValuelessByException(v);
  785. EXPECT_EQ(absl::variant_npos, v.index());
  786. v = "str";
  787. EXPECT_EQ(1, v.index());
  788. }
  789. TEST(VariantTest, ValuelessByException) {
  790. using Var = variant<MoveCanThrow, std::string, double>;
  791. Var v(absl::in_place_index_t<0>{});
  792. EXPECT_FALSE(v.valueless_by_exception());
  793. ToValuelessByException(v);
  794. EXPECT_TRUE(v.valueless_by_exception());
  795. v = "str";
  796. EXPECT_FALSE(v.valueless_by_exception());
  797. }
  798. #endif // ABSL_HAVE_EXCEPTIONS
  799. ////////////////////
  800. // [variant.swap] //
  801. ////////////////////
  802. TEST(VariantTest, MemberSwap) {
  803. SpecialSwap v1(3);
  804. SpecialSwap v2(7);
  805. variant<SpecialSwap> a = v1, b = v2;
  806. EXPECT_THAT(a, VariantWith<SpecialSwap>(v1));
  807. EXPECT_THAT(b, VariantWith<SpecialSwap>(v2));
  808. a.swap(b);
  809. EXPECT_THAT(a, VariantWith<SpecialSwap>(v2));
  810. EXPECT_THAT(b, VariantWith<SpecialSwap>(v1));
  811. EXPECT_TRUE(absl::get<SpecialSwap>(a).special_swap);
  812. using V = variant<MoveCanThrow, std::string, int>;
  813. int i = 33;
  814. std::string s = "abc";
  815. V valueless(in_place_index_t<0>{});
  816. ToValuelessByException(valueless);
  817. {
  818. // lhs and rhs holds different alternative
  819. V lhs(i), rhs(s);
  820. lhs.swap(rhs);
  821. EXPECT_THAT(lhs, VariantWith<std::string>(s));
  822. EXPECT_THAT(rhs, VariantWith<int>(i));
  823. }
  824. {
  825. // lhs is valueless
  826. V lhs(valueless), rhs(i);
  827. lhs.swap(rhs);
  828. EXPECT_THAT(lhs, VariantWith<int>(i));
  829. EXPECT_TRUE(rhs.valueless_by_exception());
  830. }
  831. {
  832. // rhs is valueless
  833. V lhs(s), rhs(valueless);
  834. lhs.swap(rhs);
  835. EXPECT_THAT(rhs, VariantWith<std::string>(s));
  836. EXPECT_TRUE(lhs.valueless_by_exception());
  837. }
  838. {
  839. // both are valueless
  840. V lhs(valueless), rhs(valueless);
  841. lhs.swap(rhs);
  842. EXPECT_TRUE(lhs.valueless_by_exception());
  843. EXPECT_TRUE(rhs.valueless_by_exception());
  844. }
  845. }
  846. //////////////////////
  847. // [variant.helper] //
  848. //////////////////////
  849. TEST(VariantTest, VariantSize) {
  850. {
  851. using Size1Variant = absl::variant<int>;
  852. EXPECT_EQ(1, absl::variant_size<Size1Variant>::value);
  853. EXPECT_EQ(1, absl::variant_size<const Size1Variant>::value);
  854. EXPECT_EQ(1, absl::variant_size<volatile Size1Variant>::value);
  855. EXPECT_EQ(1, absl::variant_size<const volatile Size1Variant>::value);
  856. }
  857. {
  858. using Size3Variant = absl::variant<int, float, int>;
  859. EXPECT_EQ(3, absl::variant_size<Size3Variant>::value);
  860. EXPECT_EQ(3, absl::variant_size<const Size3Variant>::value);
  861. EXPECT_EQ(3, absl::variant_size<volatile Size3Variant>::value);
  862. EXPECT_EQ(3, absl::variant_size<const volatile Size3Variant>::value);
  863. }
  864. }
  865. TEST(VariantTest, VariantAlternative) {
  866. {
  867. using V = absl::variant<float, int, const char*>;
  868. EXPECT_TRUE(
  869. (std::is_same<float, absl::variant_alternative_t<0, V>>::value));
  870. EXPECT_TRUE((std::is_same<const float,
  871. absl::variant_alternative_t<0, const V>>::value));
  872. EXPECT_TRUE(
  873. (std::is_same<volatile float,
  874. absl::variant_alternative_t<0, volatile V>>::value));
  875. EXPECT_TRUE((
  876. std::is_same<const volatile float,
  877. absl::variant_alternative_t<0, const volatile V>>::value));
  878. EXPECT_TRUE((std::is_same<int, absl::variant_alternative_t<1, V>>::value));
  879. EXPECT_TRUE((std::is_same<const int,
  880. absl::variant_alternative_t<1, const V>>::value));
  881. EXPECT_TRUE(
  882. (std::is_same<volatile int,
  883. absl::variant_alternative_t<1, volatile V>>::value));
  884. EXPECT_TRUE((
  885. std::is_same<const volatile int,
  886. absl::variant_alternative_t<1, const volatile V>>::value));
  887. EXPECT_TRUE(
  888. (std::is_same<const char*, absl::variant_alternative_t<2, V>>::value));
  889. EXPECT_TRUE((std::is_same<const char* const,
  890. absl::variant_alternative_t<2, const V>>::value));
  891. EXPECT_TRUE(
  892. (std::is_same<const char* volatile,
  893. absl::variant_alternative_t<2, volatile V>>::value));
  894. EXPECT_TRUE((
  895. std::is_same<const char* const volatile,
  896. absl::variant_alternative_t<2, const volatile V>>::value));
  897. }
  898. {
  899. using V = absl::variant<float, volatile int, const char*>;
  900. EXPECT_TRUE(
  901. (std::is_same<float, absl::variant_alternative_t<0, V>>::value));
  902. EXPECT_TRUE((std::is_same<const float,
  903. absl::variant_alternative_t<0, const V>>::value));
  904. EXPECT_TRUE(
  905. (std::is_same<volatile float,
  906. absl::variant_alternative_t<0, volatile V>>::value));
  907. EXPECT_TRUE((
  908. std::is_same<const volatile float,
  909. absl::variant_alternative_t<0, const volatile V>>::value));
  910. EXPECT_TRUE(
  911. (std::is_same<volatile int, absl::variant_alternative_t<1, V>>::value));
  912. EXPECT_TRUE((std::is_same<const volatile int,
  913. absl::variant_alternative_t<1, const V>>::value));
  914. EXPECT_TRUE(
  915. (std::is_same<volatile int,
  916. absl::variant_alternative_t<1, volatile V>>::value));
  917. EXPECT_TRUE((
  918. std::is_same<const volatile int,
  919. absl::variant_alternative_t<1, const volatile V>>::value));
  920. EXPECT_TRUE(
  921. (std::is_same<const char*, absl::variant_alternative_t<2, V>>::value));
  922. EXPECT_TRUE((std::is_same<const char* const,
  923. absl::variant_alternative_t<2, const V>>::value));
  924. EXPECT_TRUE(
  925. (std::is_same<const char* volatile,
  926. absl::variant_alternative_t<2, volatile V>>::value));
  927. EXPECT_TRUE((
  928. std::is_same<const char* const volatile,
  929. absl::variant_alternative_t<2, const volatile V>>::value));
  930. }
  931. }
  932. ///////////////////
  933. // [variant.get] //
  934. ///////////////////
  935. TEST(VariantTest, HoldsAlternative) {
  936. using Var = variant<int, std::string, double>;
  937. Var v = 1;
  938. EXPECT_TRUE(absl::holds_alternative<int>(v));
  939. EXPECT_FALSE(absl::holds_alternative<std::string>(v));
  940. EXPECT_FALSE(absl::holds_alternative<double>(v));
  941. v = "str";
  942. EXPECT_FALSE(absl::holds_alternative<int>(v));
  943. EXPECT_TRUE(absl::holds_alternative<std::string>(v));
  944. EXPECT_FALSE(absl::holds_alternative<double>(v));
  945. v = 0.;
  946. EXPECT_FALSE(absl::holds_alternative<int>(v));
  947. EXPECT_FALSE(absl::holds_alternative<std::string>(v));
  948. EXPECT_TRUE(absl::holds_alternative<double>(v));
  949. Var v2 = v;
  950. EXPECT_FALSE(absl::holds_alternative<int>(v2));
  951. EXPECT_FALSE(absl::holds_alternative<std::string>(v2));
  952. EXPECT_TRUE(absl::holds_alternative<double>(v2));
  953. v2.emplace<int>(3);
  954. EXPECT_TRUE(absl::holds_alternative<int>(v2));
  955. EXPECT_FALSE(absl::holds_alternative<std::string>(v2));
  956. EXPECT_FALSE(absl::holds_alternative<double>(v2));
  957. }
  958. TEST(VariantTest, GetIndex) {
  959. using Var = variant<int, std::string, double, int>;
  960. {
  961. Var v(absl::in_place_index_t<0>{}, 0);
  962. using LValueGetType = decltype(absl::get<0>(v));
  963. using RValueGetType = decltype(absl::get<0>(absl::move(v)));
  964. EXPECT_TRUE((std::is_same<LValueGetType, int&>::value));
  965. EXPECT_TRUE((std::is_same<RValueGetType, int&&>::value));
  966. EXPECT_EQ(absl::get<0>(v), 0);
  967. EXPECT_EQ(absl::get<0>(absl::move(v)), 0);
  968. const Var& const_v = v;
  969. using ConstLValueGetType = decltype(absl::get<0>(const_v));
  970. using ConstRValueGetType = decltype(absl::get<0>(absl::move(const_v)));
  971. EXPECT_TRUE((std::is_same<ConstLValueGetType, const int&>::value));
  972. EXPECT_TRUE((std::is_same<ConstRValueGetType, const int&&>::value));
  973. EXPECT_EQ(absl::get<0>(const_v), 0);
  974. EXPECT_EQ(absl::get<0>(absl::move(const_v)), 0);
  975. }
  976. {
  977. Var v = std::string("Hello");
  978. using LValueGetType = decltype(absl::get<1>(v));
  979. using RValueGetType = decltype(absl::get<1>(absl::move(v)));
  980. EXPECT_TRUE((std::is_same<LValueGetType, std::string&>::value));
  981. EXPECT_TRUE((std::is_same<RValueGetType, std::string&&>::value));
  982. EXPECT_EQ(absl::get<1>(v), "Hello");
  983. EXPECT_EQ(absl::get<1>(absl::move(v)), "Hello");
  984. const Var& const_v = v;
  985. using ConstLValueGetType = decltype(absl::get<1>(const_v));
  986. using ConstRValueGetType = decltype(absl::get<1>(absl::move(const_v)));
  987. EXPECT_TRUE((std::is_same<ConstLValueGetType, const std::string&>::value));
  988. EXPECT_TRUE((std::is_same<ConstRValueGetType, const std::string&&>::value));
  989. EXPECT_EQ(absl::get<1>(const_v), "Hello");
  990. EXPECT_EQ(absl::get<1>(absl::move(const_v)), "Hello");
  991. }
  992. {
  993. Var v = 2.0;
  994. using LValueGetType = decltype(absl::get<2>(v));
  995. using RValueGetType = decltype(absl::get<2>(absl::move(v)));
  996. EXPECT_TRUE((std::is_same<LValueGetType, double&>::value));
  997. EXPECT_TRUE((std::is_same<RValueGetType, double&&>::value));
  998. EXPECT_EQ(absl::get<2>(v), 2.);
  999. EXPECT_EQ(absl::get<2>(absl::move(v)), 2.);
  1000. const Var& const_v = v;
  1001. using ConstLValueGetType = decltype(absl::get<2>(const_v));
  1002. using ConstRValueGetType = decltype(absl::get<2>(absl::move(const_v)));
  1003. EXPECT_TRUE((std::is_same<ConstLValueGetType, const double&>::value));
  1004. EXPECT_TRUE((std::is_same<ConstRValueGetType, const double&&>::value));
  1005. EXPECT_EQ(absl::get<2>(const_v), 2.);
  1006. EXPECT_EQ(absl::get<2>(absl::move(const_v)), 2.);
  1007. }
  1008. {
  1009. Var v(absl::in_place_index_t<0>{}, 0);
  1010. v.emplace<3>(1);
  1011. using LValueGetType = decltype(absl::get<3>(v));
  1012. using RValueGetType = decltype(absl::get<3>(absl::move(v)));
  1013. EXPECT_TRUE((std::is_same<LValueGetType, int&>::value));
  1014. EXPECT_TRUE((std::is_same<RValueGetType, int&&>::value));
  1015. EXPECT_EQ(absl::get<3>(v), 1);
  1016. EXPECT_EQ(absl::get<3>(absl::move(v)), 1);
  1017. const Var& const_v = v;
  1018. using ConstLValueGetType = decltype(absl::get<3>(const_v));
  1019. using ConstRValueGetType = decltype(absl::get<3>(absl::move(const_v)));
  1020. EXPECT_TRUE((std::is_same<ConstLValueGetType, const int&>::value));
  1021. EXPECT_TRUE((std::is_same<ConstRValueGetType, const int&&>::value));
  1022. EXPECT_EQ(absl::get<3>(const_v), 1);
  1023. EXPECT_EQ(absl::get<3>(absl::move(const_v)), 1); // NOLINT
  1024. }
  1025. }
  1026. TEST(VariantTest, BadGetIndex) {
  1027. using Var = variant<int, std::string, double>;
  1028. {
  1029. Var v = 1;
  1030. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<1>(v));
  1031. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<1>(std::move(v)));
  1032. const Var& const_v = v;
  1033. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<1>(const_v));
  1034. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(
  1035. absl::get<1>(std::move(const_v))); // NOLINT
  1036. }
  1037. {
  1038. Var v = std::string("Hello");
  1039. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<0>(v));
  1040. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<0>(std::move(v)));
  1041. const Var& const_v = v;
  1042. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<0>(const_v));
  1043. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(
  1044. absl::get<0>(std::move(const_v))); // NOLINT
  1045. }
  1046. }
  1047. TEST(VariantTest, GetType) {
  1048. using Var = variant<int, std::string, double>;
  1049. {
  1050. Var v = 1;
  1051. using LValueGetType = decltype(absl::get<int>(v));
  1052. using RValueGetType = decltype(absl::get<int>(absl::move(v)));
  1053. EXPECT_TRUE((std::is_same<LValueGetType, int&>::value));
  1054. EXPECT_TRUE((std::is_same<RValueGetType, int&&>::value));
  1055. EXPECT_EQ(absl::get<int>(v), 1);
  1056. EXPECT_EQ(absl::get<int>(absl::move(v)), 1);
  1057. const Var& const_v = v;
  1058. using ConstLValueGetType = decltype(absl::get<int>(const_v));
  1059. using ConstRValueGetType = decltype(absl::get<int>(absl::move(const_v)));
  1060. EXPECT_TRUE((std::is_same<ConstLValueGetType, const int&>::value));
  1061. EXPECT_TRUE((std::is_same<ConstRValueGetType, const int&&>::value));
  1062. EXPECT_EQ(absl::get<int>(const_v), 1);
  1063. EXPECT_EQ(absl::get<int>(absl::move(const_v)), 1);
  1064. }
  1065. {
  1066. Var v = std::string("Hello");
  1067. using LValueGetType = decltype(absl::get<1>(v));
  1068. using RValueGetType = decltype(absl::get<1>(absl::move(v)));
  1069. EXPECT_TRUE((std::is_same<LValueGetType, std::string&>::value));
  1070. EXPECT_TRUE((std::is_same<RValueGetType, std::string&&>::value));
  1071. EXPECT_EQ(absl::get<std::string>(v), "Hello");
  1072. EXPECT_EQ(absl::get<std::string>(absl::move(v)), "Hello");
  1073. const Var& const_v = v;
  1074. using ConstLValueGetType = decltype(absl::get<1>(const_v));
  1075. using ConstRValueGetType = decltype(absl::get<1>(absl::move(const_v)));
  1076. EXPECT_TRUE((std::is_same<ConstLValueGetType, const std::string&>::value));
  1077. EXPECT_TRUE((std::is_same<ConstRValueGetType, const std::string&&>::value));
  1078. EXPECT_EQ(absl::get<std::string>(const_v), "Hello");
  1079. EXPECT_EQ(absl::get<std::string>(absl::move(const_v)), "Hello");
  1080. }
  1081. {
  1082. Var v = 2.0;
  1083. using LValueGetType = decltype(absl::get<2>(v));
  1084. using RValueGetType = decltype(absl::get<2>(absl::move(v)));
  1085. EXPECT_TRUE((std::is_same<LValueGetType, double&>::value));
  1086. EXPECT_TRUE((std::is_same<RValueGetType, double&&>::value));
  1087. EXPECT_EQ(absl::get<double>(v), 2.);
  1088. EXPECT_EQ(absl::get<double>(absl::move(v)), 2.);
  1089. const Var& const_v = v;
  1090. using ConstLValueGetType = decltype(absl::get<2>(const_v));
  1091. using ConstRValueGetType = decltype(absl::get<2>(absl::move(const_v)));
  1092. EXPECT_TRUE((std::is_same<ConstLValueGetType, const double&>::value));
  1093. EXPECT_TRUE((std::is_same<ConstRValueGetType, const double&&>::value));
  1094. EXPECT_EQ(absl::get<double>(const_v), 2.);
  1095. EXPECT_EQ(absl::get<double>(absl::move(const_v)), 2.);
  1096. }
  1097. }
  1098. TEST(VariantTest, BadGetType) {
  1099. using Var = variant<int, std::string, double>;
  1100. {
  1101. Var v = 1;
  1102. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<std::string>(v));
  1103. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(
  1104. absl::get<std::string>(std::move(v)));
  1105. const Var& const_v = v;
  1106. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<std::string>(const_v));
  1107. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(
  1108. absl::get<std::string>(std::move(const_v))); // NOLINT
  1109. }
  1110. {
  1111. Var v = std::string("Hello");
  1112. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<int>(v));
  1113. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<int>(std::move(v)));
  1114. const Var& const_v = v;
  1115. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(absl::get<int>(const_v));
  1116. ABSL_VARIANT_TEST_EXPECT_BAD_VARIANT_ACCESS(
  1117. absl::get<int>(std::move(const_v))); // NOLINT
  1118. }
  1119. }
  1120. TEST(VariantTest, GetIfIndex) {
  1121. using Var = variant<int, std::string, double, int>;
  1122. {
  1123. Var v(absl::in_place_index_t<0>{}, 0);
  1124. EXPECT_TRUE(noexcept(absl::get_if<0>(&v)));
  1125. {
  1126. auto* elem = absl::get_if<0>(&v);
  1127. EXPECT_TRUE((std::is_same<decltype(elem), int*>::value));
  1128. ASSERT_NE(elem, nullptr);
  1129. EXPECT_EQ(*elem, 0);
  1130. {
  1131. auto* bad_elem = absl::get_if<1>(&v);
  1132. EXPECT_TRUE((std::is_same<decltype(bad_elem), std::string*>::value));
  1133. EXPECT_EQ(bad_elem, nullptr);
  1134. }
  1135. {
  1136. auto* bad_elem = absl::get_if<2>(&v);
  1137. EXPECT_TRUE((std::is_same<decltype(bad_elem), double*>::value));
  1138. EXPECT_EQ(bad_elem, nullptr);
  1139. }
  1140. {
  1141. auto* bad_elem = absl::get_if<3>(&v);
  1142. EXPECT_TRUE((std::is_same<decltype(bad_elem), int*>::value));
  1143. EXPECT_EQ(bad_elem, nullptr);
  1144. }
  1145. }
  1146. const Var& const_v = v;
  1147. EXPECT_TRUE(noexcept(absl::get_if<0>(&const_v)));
  1148. {
  1149. auto* elem = absl::get_if<0>(&const_v);
  1150. EXPECT_TRUE((std::is_same<decltype(elem), const int*>::value));
  1151. ASSERT_NE(elem, nullptr);
  1152. EXPECT_EQ(*elem, 0);
  1153. {
  1154. auto* bad_elem = absl::get_if<1>(&const_v);
  1155. EXPECT_TRUE((std::is_same<decltype(bad_elem), const std::string*>::value));
  1156. EXPECT_EQ(bad_elem, nullptr);
  1157. }
  1158. {
  1159. auto* bad_elem = absl::get_if<2>(&const_v);
  1160. EXPECT_TRUE((std::is_same<decltype(bad_elem), const double*>::value));
  1161. EXPECT_EQ(bad_elem, nullptr);
  1162. }
  1163. {
  1164. auto* bad_elem = absl::get_if<3>(&const_v);
  1165. EXPECT_EQ(bad_elem, nullptr);
  1166. EXPECT_TRUE((std::is_same<decltype(bad_elem), const int*>::value));
  1167. }
  1168. }
  1169. }
  1170. {
  1171. Var v = std::string("Hello");
  1172. EXPECT_TRUE(noexcept(absl::get_if<1>(&v)));
  1173. {
  1174. auto* elem = absl::get_if<1>(&v);
  1175. EXPECT_TRUE((std::is_same<decltype(elem), std::string*>::value));
  1176. ASSERT_NE(elem, nullptr);
  1177. EXPECT_EQ(*elem, "Hello");
  1178. {
  1179. auto* bad_elem = absl::get_if<0>(&v);
  1180. EXPECT_TRUE((std::is_same<decltype(bad_elem), int*>::value));
  1181. EXPECT_EQ(bad_elem, nullptr);
  1182. }
  1183. {
  1184. auto* bad_elem = absl::get_if<2>(&v);
  1185. EXPECT_TRUE((std::is_same<decltype(bad_elem), double*>::value));
  1186. EXPECT_EQ(bad_elem, nullptr);
  1187. }
  1188. {
  1189. auto* bad_elem = absl::get_if<3>(&v);
  1190. EXPECT_TRUE((std::is_same<decltype(bad_elem), int*>::value));
  1191. EXPECT_EQ(bad_elem, nullptr);
  1192. }
  1193. }
  1194. const Var& const_v = v;
  1195. EXPECT_TRUE(noexcept(absl::get_if<1>(&const_v)));
  1196. {
  1197. auto* elem = absl::get_if<1>(&const_v);
  1198. EXPECT_TRUE((std::is_same<decltype(elem), const std::string*>::value));
  1199. ASSERT_NE(elem, nullptr);
  1200. EXPECT_EQ(*elem, "Hello");
  1201. {
  1202. auto* bad_elem = absl::get_if<0>(&const_v);
  1203. EXPECT_TRUE((std::is_same<decltype(bad_elem), const int*>::value));
  1204. EXPECT_EQ(bad_elem, nullptr);
  1205. }
  1206. {
  1207. auto* bad_elem = absl::get_if<2>(&const_v);
  1208. EXPECT_TRUE((std::is_same<decltype(bad_elem), const double*>::value));
  1209. EXPECT_EQ(bad_elem, nullptr);
  1210. }
  1211. {
  1212. auto* bad_elem = absl::get_if<3>(&const_v);
  1213. EXPECT_EQ(bad_elem, nullptr);
  1214. EXPECT_TRUE((std::is_same<decltype(bad_elem), const int*>::value));
  1215. }
  1216. }
  1217. }
  1218. {
  1219. Var v = 2.0;
  1220. EXPECT_TRUE(noexcept(absl::get_if<2>(&v)));
  1221. {
  1222. auto* elem = absl::get_if<2>(&v);
  1223. EXPECT_TRUE((std::is_same<decltype(elem), double*>::value));
  1224. ASSERT_NE(elem, nullptr);
  1225. EXPECT_EQ(*elem, 2.0);
  1226. {
  1227. auto* bad_elem = absl::get_if<0>(&v);
  1228. EXPECT_TRUE((std::is_same<decltype(bad_elem), int*>::value));
  1229. EXPECT_EQ(bad_elem, nullptr);
  1230. }
  1231. {
  1232. auto* bad_elem = absl::get_if<1>(&v);
  1233. EXPECT_TRUE((std::is_same<decltype(bad_elem), std::string*>::value));
  1234. EXPECT_EQ(bad_elem, nullptr);
  1235. }
  1236. {
  1237. auto* bad_elem = absl::get_if<3>(&v);
  1238. EXPECT_TRUE((std::is_same<decltype(bad_elem), int*>::value));
  1239. EXPECT_EQ(bad_elem, nullptr);
  1240. }
  1241. }
  1242. const Var& const_v = v;
  1243. EXPECT_TRUE(noexcept(absl::get_if<2>(&const_v)));
  1244. {
  1245. auto* elem = absl::get_if<2>(&const_v);
  1246. EXPECT_TRUE((std::is_same<decltype(elem), const double*>::value));
  1247. ASSERT_NE(elem, nullptr);
  1248. EXPECT_EQ(*elem, 2.0);
  1249. {
  1250. auto* bad_elem = absl::get_if<0>(&const_v);
  1251. EXPECT_TRUE((std::is_same<decltype(bad_elem), const int*>::value));
  1252. EXPECT_EQ(bad_elem, nullptr);
  1253. }
  1254. {
  1255. auto* bad_elem = absl::get_if<1>(&const_v);
  1256. EXPECT_TRUE((std::is_same<decltype(bad_elem), const std::string*>::value));
  1257. EXPECT_EQ(bad_elem, nullptr);
  1258. }
  1259. {
  1260. auto* bad_elem = absl::get_if<3>(&const_v);
  1261. EXPECT_EQ(bad_elem, nullptr);
  1262. EXPECT_TRUE((std::is_same<decltype(bad_elem), const int*>::value));
  1263. }
  1264. }
  1265. }
  1266. {
  1267. Var v(absl::in_place_index_t<0>{}, 0);
  1268. v.emplace<3>(1);
  1269. EXPECT_TRUE(noexcept(absl::get_if<3>(&v)));
  1270. {
  1271. auto* elem = absl::get_if<3>(&v);
  1272. EXPECT_TRUE((std::is_same<decltype(elem), int*>::value));
  1273. ASSERT_NE(elem, nullptr);
  1274. EXPECT_EQ(*elem, 1);
  1275. {
  1276. auto* bad_elem = absl::get_if<0>(&v);
  1277. EXPECT_TRUE((std::is_same<decltype(bad_elem), int*>::value));
  1278. EXPECT_EQ(bad_elem, nullptr);
  1279. }
  1280. {
  1281. auto* bad_elem = absl::get_if<1>(&v);
  1282. EXPECT_TRUE((std::is_same<decltype(bad_elem), std::string*>::value));
  1283. EXPECT_EQ(bad_elem, nullptr);
  1284. }
  1285. {
  1286. auto* bad_elem = absl::get_if<2>(&v);
  1287. EXPECT_TRUE((std::is_same<decltype(bad_elem), double*>::value));
  1288. EXPECT_EQ(bad_elem, nullptr);
  1289. }
  1290. }
  1291. const Var& const_v = v;
  1292. EXPECT_TRUE(noexcept(absl::get_if<3>(&const_v)));
  1293. {
  1294. auto* elem = absl::get_if<3>(&const_v);
  1295. EXPECT_TRUE((std::is_same<decltype(elem), const int*>::value));
  1296. ASSERT_NE(elem, nullptr);
  1297. EXPECT_EQ(*elem, 1);
  1298. {
  1299. auto* bad_elem = absl::get_if<0>(&const_v);
  1300. EXPECT_TRUE((std::is_same<decltype(bad_elem), const int*>::value));
  1301. EXPECT_EQ(bad_elem, nullptr);
  1302. }
  1303. {
  1304. auto* bad_elem = absl::get_if<1>(&const_v);
  1305. EXPECT_TRUE((std::is_same<decltype(bad_elem), const std::string*>::value));
  1306. EXPECT_EQ(bad_elem, nullptr);
  1307. }
  1308. {
  1309. auto* bad_elem = absl::get_if<2>(&const_v);
  1310. EXPECT_EQ(bad_elem, nullptr);
  1311. EXPECT_TRUE((std::is_same<decltype(bad_elem), const double*>::value));
  1312. }
  1313. }
  1314. }
  1315. }
  1316. //////////////////////
  1317. // [variant.relops] //
  1318. //////////////////////
  1319. TEST(VariantTest, OperatorEquals) {
  1320. variant<int, std::string> a(1), b(1);
  1321. EXPECT_TRUE(a == b);
  1322. EXPECT_TRUE(b == a);
  1323. EXPECT_FALSE(a != b);
  1324. EXPECT_FALSE(b != a);
  1325. b = "str";
  1326. EXPECT_FALSE(a == b);
  1327. EXPECT_FALSE(b == a);
  1328. EXPECT_TRUE(a != b);
  1329. EXPECT_TRUE(b != a);
  1330. b = 0;
  1331. EXPECT_FALSE(a == b);
  1332. EXPECT_FALSE(b == a);
  1333. EXPECT_TRUE(a != b);
  1334. EXPECT_TRUE(b != a);
  1335. a = b = "foo";
  1336. EXPECT_TRUE(a == b);
  1337. EXPECT_TRUE(b == a);
  1338. EXPECT_FALSE(a != b);
  1339. EXPECT_FALSE(b != a);
  1340. a = "bar";
  1341. EXPECT_FALSE(a == b);
  1342. EXPECT_FALSE(b == a);
  1343. EXPECT_TRUE(a != b);
  1344. EXPECT_TRUE(b != a);
  1345. }
  1346. TEST(VariantTest, OperatorRelational) {
  1347. variant<int, std::string> a(1), b(1);
  1348. EXPECT_FALSE(a < b);
  1349. EXPECT_FALSE(b < a);
  1350. EXPECT_FALSE(a > b);
  1351. EXPECT_FALSE(b > a);
  1352. EXPECT_TRUE(a <= b);
  1353. EXPECT_TRUE(b <= a);
  1354. EXPECT_TRUE(a >= b);
  1355. EXPECT_TRUE(b >= a);
  1356. b = "str";
  1357. EXPECT_TRUE(a < b);
  1358. EXPECT_FALSE(b < a);
  1359. EXPECT_FALSE(a > b);
  1360. EXPECT_TRUE(b > a);
  1361. EXPECT_TRUE(a <= b);
  1362. EXPECT_FALSE(b <= a);
  1363. EXPECT_FALSE(a >= b);
  1364. EXPECT_TRUE(b >= a);
  1365. b = 0;
  1366. EXPECT_FALSE(a < b);
  1367. EXPECT_TRUE(b < a);
  1368. EXPECT_TRUE(a > b);
  1369. EXPECT_FALSE(b > a);
  1370. EXPECT_FALSE(a <= b);
  1371. EXPECT_TRUE(b <= a);
  1372. EXPECT_TRUE(a >= b);
  1373. EXPECT_FALSE(b >= a);
  1374. a = b = "foo";
  1375. EXPECT_FALSE(a < b);
  1376. EXPECT_FALSE(b < a);
  1377. EXPECT_FALSE(a > b);
  1378. EXPECT_FALSE(b > a);
  1379. EXPECT_TRUE(a <= b);
  1380. EXPECT_TRUE(b <= a);
  1381. EXPECT_TRUE(a >= b);
  1382. EXPECT_TRUE(b >= a);
  1383. a = "bar";
  1384. EXPECT_TRUE(a < b);
  1385. EXPECT_FALSE(b < a);
  1386. EXPECT_FALSE(a > b);
  1387. EXPECT_TRUE(b > a);
  1388. EXPECT_TRUE(a <= b);
  1389. EXPECT_FALSE(b <= a);
  1390. EXPECT_FALSE(a >= b);
  1391. EXPECT_TRUE(b >= a);
  1392. }
  1393. #ifdef ABSL_HAVE_EXCEPTIONS
  1394. TEST(VariantTest, ValuelessOperatorEquals) {
  1395. variant<MoveCanThrow, std::string> int_v(1), string_v("Hello"),
  1396. valueless(absl::in_place_index_t<0>{}),
  1397. other_valueless(absl::in_place_index_t<0>{});
  1398. ToValuelessByException(valueless);
  1399. ToValuelessByException(other_valueless);
  1400. EXPECT_TRUE(valueless == other_valueless);
  1401. EXPECT_TRUE(other_valueless == valueless);
  1402. EXPECT_FALSE(valueless == int_v);
  1403. EXPECT_FALSE(valueless == string_v);
  1404. EXPECT_FALSE(int_v == valueless);
  1405. EXPECT_FALSE(string_v == valueless);
  1406. EXPECT_FALSE(valueless != other_valueless);
  1407. EXPECT_FALSE(other_valueless != valueless);
  1408. EXPECT_TRUE(valueless != int_v);
  1409. EXPECT_TRUE(valueless != string_v);
  1410. EXPECT_TRUE(int_v != valueless);
  1411. EXPECT_TRUE(string_v != valueless);
  1412. }
  1413. TEST(VariantTest, ValuelessOperatorRelational) {
  1414. variant<MoveCanThrow, std::string> int_v(1), string_v("Hello"),
  1415. valueless(absl::in_place_index_t<0>{}),
  1416. other_valueless(absl::in_place_index_t<0>{});
  1417. ToValuelessByException(valueless);
  1418. ToValuelessByException(other_valueless);
  1419. EXPECT_FALSE(valueless < other_valueless);
  1420. EXPECT_FALSE(other_valueless < valueless);
  1421. EXPECT_TRUE(valueless < int_v);
  1422. EXPECT_TRUE(valueless < string_v);
  1423. EXPECT_FALSE(int_v < valueless);
  1424. EXPECT_FALSE(string_v < valueless);
  1425. EXPECT_TRUE(valueless <= other_valueless);
  1426. EXPECT_TRUE(other_valueless <= valueless);
  1427. EXPECT_TRUE(valueless <= int_v);
  1428. EXPECT_TRUE(valueless <= string_v);
  1429. EXPECT_FALSE(int_v <= valueless);
  1430. EXPECT_FALSE(string_v <= valueless);
  1431. EXPECT_TRUE(valueless >= other_valueless);
  1432. EXPECT_TRUE(other_valueless >= valueless);
  1433. EXPECT_FALSE(valueless >= int_v);
  1434. EXPECT_FALSE(valueless >= string_v);
  1435. EXPECT_TRUE(int_v >= valueless);
  1436. EXPECT_TRUE(string_v >= valueless);
  1437. EXPECT_FALSE(valueless > other_valueless);
  1438. EXPECT_FALSE(other_valueless > valueless);
  1439. EXPECT_FALSE(valueless > int_v);
  1440. EXPECT_FALSE(valueless > string_v);
  1441. EXPECT_TRUE(int_v > valueless);
  1442. EXPECT_TRUE(string_v > valueless);
  1443. }
  1444. #endif
  1445. /////////////////////
  1446. // [variant.visit] //
  1447. /////////////////////
  1448. template <typename T>
  1449. struct ConvertTo {
  1450. template <typename U>
  1451. T operator()(const U& u) const {
  1452. return u;
  1453. }
  1454. };
  1455. TEST(VariantTest, VisitSimple) {
  1456. variant<std::string, const char*> v = "A";
  1457. std::string str = absl::visit(ConvertTo<std::string>{}, v);
  1458. EXPECT_EQ("A", str);
  1459. v = std::string("B");
  1460. absl::string_view piece = absl::visit(ConvertTo<absl::string_view>{}, v);
  1461. EXPECT_EQ("B", piece);
  1462. struct StrLen {
  1463. int operator()(const std::string& s) const { return s.size(); }
  1464. int operator()(const char* s) const { return strlen(s); }
  1465. };
  1466. v = "SomeStr";
  1467. EXPECT_EQ(7, absl::visit(StrLen{}, v));
  1468. v = std::string("VeryLargeThisTime");
  1469. EXPECT_EQ(17, absl::visit(StrLen{}, v));
  1470. }
  1471. TEST(VariantTest, VisitRValue) {
  1472. variant<std::string> v = std::string("X");
  1473. struct Visitor {
  1474. bool operator()(const std::string&) const { return false; }
  1475. bool operator()(std::string&&) const { return true; } // NOLINT
  1476. int operator()(const std::string&, const std::string&) const { return 0; }
  1477. int operator()(const std::string&, std::string&&) const { return 1; } // NOLINT
  1478. int operator()(std::string&&, const std::string&) const { return 2; } // NOLINT
  1479. int operator()(std::string&&, std::string&&) const { return 3; } // NOLINT
  1480. };
  1481. EXPECT_FALSE(absl::visit(Visitor{}, v));
  1482. EXPECT_TRUE(absl::visit(Visitor{}, absl::move(v)));
  1483. // Also test the variadic overload.
  1484. EXPECT_EQ(0, absl::visit(Visitor{}, v, v));
  1485. EXPECT_EQ(1, absl::visit(Visitor{}, v, absl::move(v)));
  1486. EXPECT_EQ(2, absl::visit(Visitor{}, absl::move(v), v));
  1487. EXPECT_EQ(3, absl::visit(Visitor{}, absl::move(v), absl::move(v)));
  1488. }
  1489. TEST(VariantTest, VisitRValueVisitor) {
  1490. variant<std::string> v = std::string("X");
  1491. struct Visitor {
  1492. bool operator()(const std::string&) const& { return false; }
  1493. bool operator()(const std::string&) && { return true; }
  1494. };
  1495. Visitor visitor;
  1496. EXPECT_FALSE(absl::visit(visitor, v));
  1497. EXPECT_TRUE(absl::visit(Visitor{}, v));
  1498. }
  1499. TEST(VariantTest, VisitResultTypeDifferent) {
  1500. variant<std::string> v = std::string("X");
  1501. struct LValue_LValue {};
  1502. struct RValue_LValue {};
  1503. struct LValue_RValue {};
  1504. struct RValue_RValue {};
  1505. struct Visitor {
  1506. LValue_LValue operator()(const std::string&) const& { return {}; }
  1507. RValue_LValue operator()(std::string&&) const& { return {}; } // NOLINT
  1508. LValue_RValue operator()(const std::string&) && { return {}; }
  1509. RValue_RValue operator()(std::string&&) && { return {}; } // NOLINT
  1510. } visitor;
  1511. EXPECT_TRUE(
  1512. (std::is_same<LValue_LValue, decltype(absl::visit(visitor, v))>::value));
  1513. EXPECT_TRUE(
  1514. (std::is_same<RValue_LValue,
  1515. decltype(absl::visit(visitor, absl::move(v)))>::value));
  1516. EXPECT_TRUE((
  1517. std::is_same<LValue_RValue, decltype(absl::visit(Visitor{}, v))>::value));
  1518. EXPECT_TRUE(
  1519. (std::is_same<RValue_RValue,
  1520. decltype(absl::visit(Visitor{}, absl::move(v)))>::value));
  1521. }
  1522. TEST(VariantTest, VisitVariadic) {
  1523. using A = variant<int, std::string>;
  1524. using B = variant<std::unique_ptr<int>, absl::string_view>;
  1525. struct Visitor {
  1526. std::pair<int, int> operator()(int a, std::unique_ptr<int> b) const {
  1527. return {a, *b};
  1528. }
  1529. std::pair<int, int> operator()(absl::string_view a,
  1530. std::unique_ptr<int> b) const {
  1531. return {static_cast<int>(a.size()), static_cast<int>(*b)};
  1532. }
  1533. std::pair<int, int> operator()(int a, absl::string_view b) const {
  1534. return {a, static_cast<int>(b.size())};
  1535. }
  1536. std::pair<int, int> operator()(absl::string_view a,
  1537. absl::string_view b) const {
  1538. return {static_cast<int>(a.size()), static_cast<int>(b.size())};
  1539. }
  1540. };
  1541. EXPECT_THAT(absl::visit(Visitor(), A(1), B(std::unique_ptr<int>(new int(7)))),
  1542. ::testing::Pair(1, 7));
  1543. EXPECT_THAT(absl::visit(Visitor(), A(1), B(absl::string_view("ABC"))),
  1544. ::testing::Pair(1, 3));
  1545. EXPECT_THAT(absl::visit(Visitor(), A(std::string("BBBBB")),
  1546. B(std::unique_ptr<int>(new int(7)))),
  1547. ::testing::Pair(5, 7));
  1548. EXPECT_THAT(
  1549. absl::visit(Visitor(), A(std::string("BBBBB")), B(absl::string_view("ABC"))),
  1550. ::testing::Pair(5, 3));
  1551. }
  1552. TEST(VariantTest, VisitNoArgs) {
  1553. EXPECT_EQ(5, absl::visit([] { return 5; }));
  1554. }
  1555. struct ConstFunctor {
  1556. int operator()(int a, int b) const { return a - b; }
  1557. };
  1558. struct MutableFunctor {
  1559. int operator()(int a, int b) { return a - b; }
  1560. };
  1561. struct Class {
  1562. int Method(int a, int b) { return a - b; }
  1563. int ConstMethod(int a, int b) const { return a - b; }
  1564. int member;
  1565. };
  1566. TEST(VariantTest, VisitReferenceWrapper) {
  1567. ConstFunctor cf;
  1568. MutableFunctor mf;
  1569. absl::variant<int> three = 3;
  1570. absl::variant<int> two = 2;
  1571. EXPECT_EQ(1, absl::visit(std::cref(cf), three, two));
  1572. EXPECT_EQ(1, absl::visit(std::ref(cf), three, two));
  1573. EXPECT_EQ(1, absl::visit(std::ref(mf), three, two));
  1574. }
  1575. // libstdc++ std::variant doesn't support the INVOKE semantics.
  1576. #if !(defined(ABSL_HAVE_STD_VARIANT) && defined(__GLIBCXX__))
  1577. TEST(VariantTest, VisitMemberFunction) {
  1578. absl::variant<std::unique_ptr<Class>> p(absl::make_unique<Class>());
  1579. absl::variant<std::unique_ptr<const Class>> cp(
  1580. absl::make_unique<const Class>());
  1581. absl::variant<int> three = 3;
  1582. absl::variant<int> two = 2;
  1583. EXPECT_EQ(1, absl::visit(&Class::Method, p, three, two));
  1584. EXPECT_EQ(1, absl::visit(&Class::ConstMethod, p, three, two));
  1585. EXPECT_EQ(1, absl::visit(&Class::ConstMethod, cp, three, two));
  1586. }
  1587. TEST(VariantTest, VisitDataMember) {
  1588. absl::variant<std::unique_ptr<Class>> p(absl::make_unique<Class>(Class{42}));
  1589. absl::variant<std::unique_ptr<const Class>> cp(
  1590. absl::make_unique<const Class>(Class{42}));
  1591. EXPECT_EQ(42, absl::visit(&Class::member, p));
  1592. absl::visit(&Class::member, p) = 5;
  1593. EXPECT_EQ(5, absl::visit(&Class::member, p));
  1594. EXPECT_EQ(42, absl::visit(&Class::member, cp));
  1595. }
  1596. #endif // !(defined(ABSL_HAVE_STD_VARIANT) && defined(__GLIBCXX__))
  1597. /////////////////////////
  1598. // [variant.monostate] //
  1599. /////////////////////////
  1600. TEST(VariantTest, MonostateBasic) {
  1601. absl::monostate mono;
  1602. (void)mono;
  1603. // TODO(mattcalabrese) Expose move triviality metafunctions in absl.
  1604. EXPECT_TRUE(absl::is_trivially_default_constructible<absl::monostate>::value);
  1605. EXPECT_TRUE(is_trivially_move_constructible<absl::monostate>::value);
  1606. EXPECT_TRUE(absl::is_trivially_copy_constructible<absl::monostate>::value);
  1607. EXPECT_TRUE(is_trivially_move_assignable<absl::monostate>::value);
  1608. EXPECT_TRUE(absl::is_trivially_copy_assignable<absl::monostate>::value);
  1609. EXPECT_TRUE(absl::is_trivially_destructible<absl::monostate>::value);
  1610. }
  1611. TEST(VariantTest, VariantMonostateDefaultConstruction) {
  1612. absl::variant<absl::monostate, NonDefaultConstructible> var;
  1613. EXPECT_EQ(var.index(), 0);
  1614. }
  1615. ////////////////////////////////
  1616. // [variant.monostate.relops] //
  1617. ////////////////////////////////
  1618. TEST(VariantTest, MonostateComparisons) {
  1619. absl::monostate lhs, rhs;
  1620. EXPECT_EQ(lhs, lhs);
  1621. EXPECT_EQ(lhs, rhs);
  1622. EXPECT_FALSE(lhs != lhs);
  1623. EXPECT_FALSE(lhs != rhs);
  1624. EXPECT_FALSE(lhs < lhs);
  1625. EXPECT_FALSE(lhs < rhs);
  1626. EXPECT_FALSE(lhs > lhs);
  1627. EXPECT_FALSE(lhs > rhs);
  1628. EXPECT_LE(lhs, lhs);
  1629. EXPECT_LE(lhs, rhs);
  1630. EXPECT_GE(lhs, lhs);
  1631. EXPECT_GE(lhs, rhs);
  1632. EXPECT_TRUE(noexcept(std::declval<absl::monostate>() ==
  1633. std::declval<absl::monostate>()));
  1634. EXPECT_TRUE(noexcept(std::declval<absl::monostate>() !=
  1635. std::declval<absl::monostate>()));
  1636. EXPECT_TRUE(noexcept(std::declval<absl::monostate>() <
  1637. std::declval<absl::monostate>()));
  1638. EXPECT_TRUE(noexcept(std::declval<absl::monostate>() >
  1639. std::declval<absl::monostate>()));
  1640. EXPECT_TRUE(noexcept(std::declval<absl::monostate>() <=
  1641. std::declval<absl::monostate>()));
  1642. EXPECT_TRUE(noexcept(std::declval<absl::monostate>() >=
  1643. std::declval<absl::monostate>()));
  1644. }
  1645. ///////////////////////
  1646. // [variant.specalg] //
  1647. ///////////////////////
  1648. TEST(VariantTest, NonmemberSwap) {
  1649. using std::swap;
  1650. SpecialSwap v1(3);
  1651. SpecialSwap v2(7);
  1652. variant<SpecialSwap> a = v1, b = v2;
  1653. EXPECT_THAT(a, VariantWith<SpecialSwap>(v1));
  1654. EXPECT_THAT(b, VariantWith<SpecialSwap>(v2));
  1655. std::swap(a, b);
  1656. EXPECT_THAT(a, VariantWith<SpecialSwap>(v2));
  1657. EXPECT_THAT(b, VariantWith<SpecialSwap>(v1));
  1658. #ifndef ABSL_HAVE_STD_VARIANT
  1659. EXPECT_FALSE(absl::get<SpecialSwap>(a).special_swap);
  1660. #endif
  1661. swap(a, b);
  1662. EXPECT_THAT(a, VariantWith<SpecialSwap>(v1));
  1663. EXPECT_THAT(b, VariantWith<SpecialSwap>(v2));
  1664. EXPECT_TRUE(absl::get<SpecialSwap>(b).special_swap);
  1665. }
  1666. //////////////////////////
  1667. // [variant.bad.access] //
  1668. //////////////////////////
  1669. TEST(VariantTest, BadAccess) {
  1670. EXPECT_TRUE(noexcept(absl::bad_variant_access()));
  1671. absl::bad_variant_access exception_obj;
  1672. std::exception* base = &exception_obj;
  1673. (void)base;
  1674. }
  1675. ////////////////////
  1676. // [variant.hash] //
  1677. ////////////////////
  1678. TEST(VariantTest, MonostateHash) {
  1679. absl::monostate mono, other_mono;
  1680. std::hash<absl::monostate> const hasher{};
  1681. static_assert(std::is_same<decltype(hasher(mono)), std::size_t>::value, "");
  1682. EXPECT_EQ(hasher(mono), hasher(other_mono));
  1683. }
  1684. TEST(VariantTest, Hash) {
  1685. static_assert(type_traits_internal::IsHashEnabled<variant<int>>::value, "");
  1686. static_assert(type_traits_internal::IsHashEnabled<variant<Hashable>>::value,
  1687. "");
  1688. static_assert(
  1689. type_traits_internal::IsHashEnabled<variant<int, Hashable>>::value, "");
  1690. #if defined(_MSC_VER) || \
  1691. (defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 4000 && \
  1692. _LIBCPP_STD_VER > 11) || \
  1693. defined(__APPLE__)
  1694. // For MSVC and libc++ (< 4.0 and c++14), std::hash primary template has a
  1695. // static_assert to catch any user-defined type T that doesn't provide a hash
  1696. // specialization. So instantiating std::hash<variant<T>> will result
  1697. // in a hard error which is not SFINAE friendly.
  1698. #define ABSL_STD_HASH_NOT_SFINAE_FRIENDLY 1
  1699. #endif
  1700. #ifndef ABSL_STD_HASH_NOT_SFINAE_FRIENDLY
  1701. static_assert(
  1702. !type_traits_internal::IsHashEnabled<variant<NonHashable>>::value, "");
  1703. static_assert(!type_traits_internal::IsHashEnabled<
  1704. variant<Hashable, NonHashable>>::value,
  1705. "");
  1706. #endif
  1707. // MSVC std::hash<std::variant> does not use the index, thus produce the same
  1708. // result on the same value as different alternative.
  1709. #if !(defined(_MSC_VER) && defined(ABSL_HAVE_STD_VARIANT))
  1710. {
  1711. // same value as different alternative
  1712. variant<int, int> v0(in_place_index_t<0>{}, 42);
  1713. variant<int, int> v1(in_place_index_t<1>{}, 42);
  1714. std::hash<variant<int, int>> hash;
  1715. EXPECT_NE(hash(v0), hash(v1));
  1716. }
  1717. #endif // !(defined(_MSC_VER) && defined(ABSL_HAVE_STD_VARIANT))
  1718. {
  1719. std::hash<variant<int>> hash;
  1720. std::set<size_t> hashcodes;
  1721. for (int i = 0; i < 100; ++i) {
  1722. hashcodes.insert(hash(i));
  1723. }
  1724. EXPECT_GT(hashcodes.size(), 90);
  1725. // test const-qualified
  1726. static_assert(
  1727. type_traits_internal::IsHashEnabled<variant<const int>>::value, "");
  1728. static_assert(
  1729. type_traits_internal::IsHashEnabled<variant<const Hashable>>::value,
  1730. "");
  1731. std::hash<absl::variant<const int>> c_hash;
  1732. for (int i = 0; i < 100; ++i) {
  1733. EXPECT_EQ(hash(i), c_hash(i));
  1734. }
  1735. }
  1736. }
  1737. ////////////////////////////////////////
  1738. // Miscellaneous and deprecated tests //
  1739. ////////////////////////////////////////
  1740. // Test that a set requiring a basic type conversion works correctly.
  1741. TEST(VariantTest, TestConvertingSet) {
  1742. typedef variant<double> Variant;
  1743. Variant v(1.0);
  1744. const int two = 2;
  1745. v = two;
  1746. EXPECT_TRUE(absl::holds_alternative<double>(v));
  1747. ASSERT_TRUE(nullptr != absl::get_if<double>(&v));
  1748. EXPECT_DOUBLE_EQ(2, absl::get<double>(v));
  1749. }
  1750. // Test that a vector of variants behaves reasonably.
  1751. TEST(VariantTest, Container) {
  1752. typedef variant<int, float> Variant;
  1753. // Creation of vector should work
  1754. std::vector<Variant> vec;
  1755. vec.push_back(Variant(10));
  1756. vec.push_back(Variant(20.0f));
  1757. // Vector resizing should work if we supply a value for new slots
  1758. vec.resize(10, Variant(0));
  1759. }
  1760. // Test that a variant with a non-copyable type can be constructed and
  1761. // manipulated to some degree.
  1762. TEST(VariantTest, TestVariantWithNonCopyableType) {
  1763. typedef variant<int, NonCopyable> Variant;
  1764. const int kValue = 1;
  1765. Variant v(kValue);
  1766. ASSERT_TRUE(absl::holds_alternative<int>(v));
  1767. EXPECT_EQ(kValue, absl::get<int>(v));
  1768. }
  1769. // Test that a variant with a non-copyable type can be transformed to
  1770. // the non-copyable type with a call to `emplace` for different numbers
  1771. // of arguments. We do not need to test this for each of T1 ... T8
  1772. // because `emplace` does not overload on T1 ... to T8, so if this
  1773. // works for any one of T1 ... T8, then it works for all of them. We
  1774. // do need to test that it works with varying numbers of parameters
  1775. // though.
  1776. TEST(VariantTest, TestEmplace) {
  1777. typedef variant<int, NonCopyable> Variant;
  1778. const int kValue = 1;
  1779. Variant v(kValue);
  1780. ASSERT_TRUE(absl::holds_alternative<int>(v));
  1781. EXPECT_EQ(kValue, absl::get<int>(v));
  1782. // emplace with zero arguments, then back to 'int'
  1783. v.emplace<NonCopyable>();
  1784. ASSERT_TRUE(absl::holds_alternative<NonCopyable>(v));
  1785. EXPECT_EQ(0, absl::get<NonCopyable>(v).value);
  1786. v = kValue;
  1787. ASSERT_TRUE(absl::holds_alternative<int>(v));
  1788. // emplace with one argument:
  1789. v.emplace<NonCopyable>(1);
  1790. ASSERT_TRUE(absl::holds_alternative<NonCopyable>(v));
  1791. EXPECT_EQ(1, absl::get<NonCopyable>(v).value);
  1792. v = kValue;
  1793. ASSERT_TRUE(absl::holds_alternative<int>(v));
  1794. // emplace with two arguments:
  1795. v.emplace<NonCopyable>(1, 2);
  1796. ASSERT_TRUE(absl::holds_alternative<NonCopyable>(v));
  1797. EXPECT_EQ(3, absl::get<NonCopyable>(v).value);
  1798. v = kValue;
  1799. ASSERT_TRUE(absl::holds_alternative<int>(v));
  1800. // emplace with three arguments
  1801. v.emplace<NonCopyable>(1, 2, 3);
  1802. ASSERT_TRUE(absl::holds_alternative<NonCopyable>(v));
  1803. EXPECT_EQ(6, absl::get<NonCopyable>(v).value);
  1804. v = kValue;
  1805. ASSERT_TRUE(absl::holds_alternative<int>(v));
  1806. // emplace with four arguments
  1807. v.emplace<NonCopyable>(1, 2, 3, 4);
  1808. ASSERT_TRUE(absl::holds_alternative<NonCopyable>(v));
  1809. EXPECT_EQ(10, absl::get<NonCopyable>(v).value);
  1810. v = kValue;
  1811. ASSERT_TRUE(absl::holds_alternative<int>(v));
  1812. }
  1813. TEST(VariantTest, TestEmplaceDestroysCurrentValue) {
  1814. typedef variant<int, IncrementInDtor, NonCopyable> Variant;
  1815. int counter = 0;
  1816. Variant v(0);
  1817. ASSERT_TRUE(absl::holds_alternative<int>(v));
  1818. v.emplace<IncrementInDtor>(&counter);
  1819. ASSERT_TRUE(absl::holds_alternative<IncrementInDtor>(v));
  1820. ASSERT_EQ(0, counter);
  1821. v.emplace<NonCopyable>();
  1822. ASSERT_TRUE(absl::holds_alternative<NonCopyable>(v));
  1823. EXPECT_EQ(1, counter);
  1824. }
  1825. TEST(VariantTest, TestMoveSemantics) {
  1826. typedef variant<std::unique_ptr<int>, std::unique_ptr<std::string>> Variant;
  1827. // Construct a variant by moving from an element value.
  1828. Variant v(absl::WrapUnique(new int(10)));
  1829. EXPECT_TRUE(absl::holds_alternative<std::unique_ptr<int>>(v));
  1830. // Construct a variant by moving from another variant.
  1831. Variant v2(absl::move(v));
  1832. ASSERT_TRUE(absl::holds_alternative<std::unique_ptr<int>>(v2));
  1833. ASSERT_NE(nullptr, absl::get<std::unique_ptr<int>>(v2));
  1834. EXPECT_EQ(10, *absl::get<std::unique_ptr<int>>(v2));
  1835. // Moving from a variant object leaves it holding moved-from value of the
  1836. // same element type.
  1837. EXPECT_TRUE(absl::holds_alternative<std::unique_ptr<int>>(v));
  1838. ASSERT_NE(nullptr, absl::get_if<std::unique_ptr<int>>(&v));
  1839. EXPECT_EQ(nullptr, absl::get<std::unique_ptr<int>>(v));
  1840. // Assign a variant from an element value by move.
  1841. v = absl::make_unique<std::string>("foo");
  1842. ASSERT_TRUE(absl::holds_alternative<std::unique_ptr<std::string>>(v));
  1843. EXPECT_EQ("foo", *absl::get<std::unique_ptr<std::string>>(v));
  1844. // Move-assign a variant.
  1845. v2 = absl::move(v);
  1846. ASSERT_TRUE(absl::holds_alternative<std::unique_ptr<std::string>>(v2));
  1847. EXPECT_EQ("foo", *absl::get<std::unique_ptr<std::string>>(v2));
  1848. EXPECT_TRUE(absl::holds_alternative<std::unique_ptr<std::string>>(v));
  1849. }
  1850. variant<int, std::string> PassThrough(const variant<int, std::string>& arg) {
  1851. return arg;
  1852. }
  1853. TEST(VariantTest, TestImplicitConversion) {
  1854. EXPECT_TRUE(absl::holds_alternative<int>(PassThrough(0)));
  1855. // We still need the explicit cast for std::string, because C++ won't apply
  1856. // two user-defined implicit conversions in a row.
  1857. EXPECT_TRUE(absl::holds_alternative<std::string>(PassThrough(std::string("foo"))));
  1858. }
  1859. struct Convertible2;
  1860. struct Convertible1 {
  1861. Convertible1() {}
  1862. Convertible1(const Convertible1&) {}
  1863. Convertible1& operator=(const Convertible1&) { return *this; }
  1864. // implicit conversion from Convertible2
  1865. Convertible1(const Convertible2&) {} // NOLINT(runtime/explicit)
  1866. };
  1867. struct Convertible2 {
  1868. Convertible2() {}
  1869. Convertible2(const Convertible2&) {}
  1870. Convertible2& operator=(const Convertible2&) { return *this; }
  1871. // implicit conversion from Convertible1
  1872. Convertible2(const Convertible1&) {} // NOLINT(runtime/explicit)
  1873. };
  1874. TEST(VariantTest, TestRvalueConversion) {
  1875. variant<double, std::string> var(
  1876. ConvertVariantTo<variant<double, std::string>>(variant<std::string, int>(0)));
  1877. ASSERT_TRUE(absl::holds_alternative<double>(var));
  1878. EXPECT_EQ(0.0, absl::get<double>(var));
  1879. var = ConvertVariantTo<variant<double, std::string>>(
  1880. variant<const char*, float>("foo"));
  1881. ASSERT_TRUE(absl::holds_alternative<std::string>(var));
  1882. EXPECT_EQ("foo", absl::get<std::string>(var));
  1883. variant<double> singleton(
  1884. ConvertVariantTo<variant<double>>(variant<int, float>(42)));
  1885. ASSERT_TRUE(absl::holds_alternative<double>(singleton));
  1886. EXPECT_EQ(42.0, absl::get<double>(singleton));
  1887. singleton = ConvertVariantTo<variant<double>>(variant<int, float>(3.14f));
  1888. ASSERT_TRUE(absl::holds_alternative<double>(singleton));
  1889. EXPECT_FLOAT_EQ(3.14f, static_cast<float>(absl::get<double>(singleton)));
  1890. singleton = ConvertVariantTo<variant<double>>(variant<int>(0));
  1891. ASSERT_TRUE(absl::holds_alternative<double>(singleton));
  1892. EXPECT_EQ(0.0, absl::get<double>(singleton));
  1893. variant<int32_t, uint32_t> variant2(
  1894. ConvertVariantTo<variant<int32_t, uint32_t>>(variant<int32_t>(42)));
  1895. ASSERT_TRUE(absl::holds_alternative<int32_t>(variant2));
  1896. EXPECT_EQ(42, absl::get<int32_t>(variant2));
  1897. variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(variant<uint32_t>(42));
  1898. ASSERT_TRUE(absl::holds_alternative<uint32_t>(variant2));
  1899. EXPECT_EQ(42, absl::get<uint32_t>(variant2));
  1900. variant<Convertible1, Convertible2> variant3(
  1901. ConvertVariantTo<variant<Convertible1, Convertible2>>(
  1902. (variant<Convertible2, Convertible1>(Convertible1()))));
  1903. ASSERT_TRUE(absl::holds_alternative<Convertible1>(variant3));
  1904. variant3 = ConvertVariantTo<variant<Convertible1, Convertible2>>(
  1905. variant<Convertible2, Convertible1>(Convertible2()));
  1906. ASSERT_TRUE(absl::holds_alternative<Convertible2>(variant3));
  1907. }
  1908. TEST(VariantTest, TestLvalueConversion) {
  1909. variant<std::string, int> source1 = 0;
  1910. variant<double, std::string> destination(
  1911. ConvertVariantTo<variant<double, std::string>>(source1));
  1912. ASSERT_TRUE(absl::holds_alternative<double>(destination));
  1913. EXPECT_EQ(0.0, absl::get<double>(destination));
  1914. variant<const char*, float> source2 = "foo";
  1915. destination = ConvertVariantTo<variant<double, std::string>>(source2);
  1916. ASSERT_TRUE(absl::holds_alternative<std::string>(destination));
  1917. EXPECT_EQ("foo", absl::get<std::string>(destination));
  1918. variant<int, float> source3(42);
  1919. variant<double> singleton(ConvertVariantTo<variant<double>>(source3));
  1920. ASSERT_TRUE(absl::holds_alternative<double>(singleton));
  1921. EXPECT_EQ(42.0, absl::get<double>(singleton));
  1922. source3 = 3.14f;
  1923. singleton = ConvertVariantTo<variant<double>>(source3);
  1924. ASSERT_TRUE(absl::holds_alternative<double>(singleton));
  1925. EXPECT_FLOAT_EQ(3.14f, static_cast<float>(absl::get<double>(singleton)));
  1926. variant<int> source4(0);
  1927. singleton = ConvertVariantTo<variant<double>>(source4);
  1928. ASSERT_TRUE(absl::holds_alternative<double>(singleton));
  1929. EXPECT_EQ(0.0, absl::get<double>(singleton));
  1930. variant<int32_t> source5(42);
  1931. variant<int32_t, uint32_t> variant2(
  1932. ConvertVariantTo<variant<int32_t, uint32_t>>(source5));
  1933. ASSERT_TRUE(absl::holds_alternative<int32_t>(variant2));
  1934. EXPECT_EQ(42, absl::get<int32_t>(variant2));
  1935. variant<uint32_t> source6(42);
  1936. variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(source6);
  1937. ASSERT_TRUE(absl::holds_alternative<uint32_t>(variant2));
  1938. EXPECT_EQ(42, absl::get<uint32_t>(variant2));
  1939. variant<Convertible2, Convertible1> source7((Convertible1()));
  1940. variant<Convertible1, Convertible2> variant3(
  1941. ConvertVariantTo<variant<Convertible1, Convertible2>>(source7));
  1942. ASSERT_TRUE(absl::holds_alternative<Convertible1>(variant3));
  1943. source7 = Convertible2();
  1944. variant3 = ConvertVariantTo<variant<Convertible1, Convertible2>>(source7);
  1945. ASSERT_TRUE(absl::holds_alternative<Convertible2>(variant3));
  1946. }
  1947. TEST(VariantTest, TestMoveConversion) {
  1948. using Variant =
  1949. variant<std::unique_ptr<const int>, std::unique_ptr<const std::string>>;
  1950. using OtherVariant = variant<std::unique_ptr<int>, std::unique_ptr<std::string>>;
  1951. Variant var(
  1952. ConvertVariantTo<Variant>(OtherVariant{absl::make_unique<int>(0)}));
  1953. ASSERT_TRUE(absl::holds_alternative<std::unique_ptr<const int>>(var));
  1954. ASSERT_NE(absl::get<std::unique_ptr<const int>>(var), nullptr);
  1955. EXPECT_EQ(0, *absl::get<std::unique_ptr<const int>>(var));
  1956. var =
  1957. ConvertVariantTo<Variant>(OtherVariant(absl::make_unique<std::string>("foo")));
  1958. ASSERT_TRUE(absl::holds_alternative<std::unique_ptr<const std::string>>(var));
  1959. EXPECT_EQ("foo", *absl::get<std::unique_ptr<const std::string>>(var));
  1960. }
  1961. TEST(VariantTest, DoesNotMoveFromLvalues) {
  1962. // We use shared_ptr here because it's both copyable and movable, and
  1963. // a moved-from shared_ptr is guaranteed to be null, so we can detect
  1964. // whether moving or copying has occurred.
  1965. using Variant =
  1966. variant<std::shared_ptr<const int>, std::shared_ptr<const std::string>>;
  1967. using OtherVariant = variant<std::shared_ptr<int>, std::shared_ptr<std::string>>;
  1968. Variant v1(std::make_shared<const int>(0));
  1969. // Test copy constructor
  1970. Variant v2(v1);
  1971. EXPECT_EQ(absl::get<std::shared_ptr<const int>>(v1),
  1972. absl::get<std::shared_ptr<const int>>(v2));
  1973. // Test copy-assignment operator
  1974. v1 = std::make_shared<const std::string>("foo");
  1975. v2 = v1;
  1976. EXPECT_EQ(absl::get<std::shared_ptr<const std::string>>(v1),
  1977. absl::get<std::shared_ptr<const std::string>>(v2));
  1978. // Test converting copy constructor
  1979. OtherVariant other(std::make_shared<int>(0));
  1980. Variant v3(ConvertVariantTo<Variant>(other));
  1981. EXPECT_EQ(absl::get<std::shared_ptr<int>>(other),
  1982. absl::get<std::shared_ptr<const int>>(v3));
  1983. other = std::make_shared<std::string>("foo");
  1984. v3 = ConvertVariantTo<Variant>(other);
  1985. EXPECT_EQ(absl::get<std::shared_ptr<std::string>>(other),
  1986. absl::get<std::shared_ptr<const std::string>>(v3));
  1987. }
  1988. TEST(VariantTest, TestRvalueConversionViaConvertVariantTo) {
  1989. variant<double, std::string> var(
  1990. ConvertVariantTo<variant<double, std::string>>(variant<std::string, int>(3)));
  1991. EXPECT_THAT(absl::get_if<double>(&var), Pointee(3.0));
  1992. var = ConvertVariantTo<variant<double, std::string>>(
  1993. variant<const char*, float>("foo"));
  1994. EXPECT_THAT(absl::get_if<std::string>(&var), Pointee(std::string("foo")));
  1995. variant<double> singleton(
  1996. ConvertVariantTo<variant<double>>(variant<int, float>(42)));
  1997. EXPECT_THAT(absl::get_if<double>(&singleton), Pointee(42.0));
  1998. singleton = ConvertVariantTo<variant<double>>(variant<int, float>(3.14f));
  1999. EXPECT_THAT(absl::get_if<double>(&singleton), Pointee(DoubleEq(3.14f)));
  2000. singleton = ConvertVariantTo<variant<double>>(variant<int>(3));
  2001. EXPECT_THAT(absl::get_if<double>(&singleton), Pointee(3.0));
  2002. variant<int32_t, uint32_t> variant2(
  2003. ConvertVariantTo<variant<int32_t, uint32_t>>(variant<int32_t>(42)));
  2004. EXPECT_THAT(absl::get_if<int32_t>(&variant2), Pointee(42));
  2005. variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(variant<uint32_t>(42));
  2006. EXPECT_THAT(absl::get_if<uint32_t>(&variant2), Pointee(42));
  2007. variant<Convertible1, Convertible2> variant3(
  2008. ConvertVariantTo<variant<Convertible1, Convertible2>>(
  2009. (variant<Convertible2, Convertible1>(Convertible1()))));
  2010. ASSERT_TRUE(absl::holds_alternative<Convertible1>(variant3));
  2011. variant3 = ConvertVariantTo<variant<Convertible1, Convertible2>>(
  2012. variant<Convertible2, Convertible1>(Convertible2()));
  2013. ASSERT_TRUE(absl::holds_alternative<Convertible2>(variant3));
  2014. }
  2015. TEST(VariantTest, TestLvalueConversionViaConvertVariantTo) {
  2016. variant<std::string, int> source1 = 3;
  2017. variant<double, std::string> destination(
  2018. ConvertVariantTo<variant<double, std::string>>(source1));
  2019. EXPECT_THAT(absl::get_if<double>(&destination), Pointee(3.0));
  2020. variant<const char*, float> source2 = "foo";
  2021. destination = ConvertVariantTo<variant<double, std::string>>(source2);
  2022. EXPECT_THAT(absl::get_if<std::string>(&destination), Pointee(std::string("foo")));
  2023. variant<int, float> source3(42);
  2024. variant<double> singleton(ConvertVariantTo<variant<double>>(source3));
  2025. EXPECT_THAT(absl::get_if<double>(&singleton), Pointee(42.0));
  2026. source3 = 3.14f;
  2027. singleton = ConvertVariantTo<variant<double>>(source3);
  2028. EXPECT_FLOAT_EQ(3.14f, static_cast<float>(absl::get<double>(singleton)));
  2029. EXPECT_THAT(absl::get_if<double>(&singleton), Pointee(DoubleEq(3.14f)));
  2030. variant<int> source4(3);
  2031. singleton = ConvertVariantTo<variant<double>>(source4);
  2032. EXPECT_THAT(absl::get_if<double>(&singleton), Pointee(3.0));
  2033. variant<int32_t> source5(42);
  2034. variant<int32_t, uint32_t> variant2(
  2035. ConvertVariantTo<variant<int32_t, uint32_t>>(source5));
  2036. EXPECT_THAT(absl::get_if<int32_t>(&variant2), Pointee(42));
  2037. variant<uint32_t> source6(42);
  2038. variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(source6);
  2039. EXPECT_THAT(absl::get_if<uint32_t>(&variant2), Pointee(42));
  2040. variant<Convertible2, Convertible1> source7((Convertible1()));
  2041. variant<Convertible1, Convertible2> variant3(
  2042. ConvertVariantTo<variant<Convertible1, Convertible2>>(source7));
  2043. ASSERT_TRUE(absl::holds_alternative<Convertible1>(variant3));
  2044. source7 = Convertible2();
  2045. variant3 = ConvertVariantTo<variant<Convertible1, Convertible2>>(source7);
  2046. ASSERT_TRUE(absl::holds_alternative<Convertible2>(variant3));
  2047. }
  2048. TEST(VariantTest, TestMoveConversionViaConvertVariantTo) {
  2049. using Variant =
  2050. variant<std::unique_ptr<const int>, std::unique_ptr<const std::string>>;
  2051. using OtherVariant = variant<std::unique_ptr<int>, std::unique_ptr<std::string>>;
  2052. Variant var(
  2053. ConvertVariantTo<Variant>(OtherVariant{absl::make_unique<int>(3)}));
  2054. EXPECT_THAT(absl::get_if<std::unique_ptr<const int>>(&var),
  2055. Pointee(Pointee(3)));
  2056. var =
  2057. ConvertVariantTo<Variant>(OtherVariant(absl::make_unique<std::string>("foo")));
  2058. EXPECT_THAT(absl::get_if<std::unique_ptr<const std::string>>(&var),
  2059. Pointee(Pointee(std::string("foo"))));
  2060. }
  2061. // If all alternatives are trivially copy/move constructible, variant should
  2062. // also be trivially copy/move constructible. This is not required by the
  2063. // standard and we know that libstdc++ variant doesn't have this feature.
  2064. // For more details see the paper:
  2065. // http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0602r0.html
  2066. #if !(defined(ABSL_HAVE_STD_VARIANT) && defined(__GLIBCXX__))
  2067. #define ABSL_VARIANT_PROPAGATE_COPY_MOVE_TRIVIALITY 1
  2068. #endif
  2069. TEST(VariantTest, TestCopyAndMoveTypeTraits) {
  2070. EXPECT_TRUE(std::is_copy_constructible<variant<std::string>>::value);
  2071. EXPECT_TRUE(std::is_copy_assignable<variant<std::string>>::value);
  2072. EXPECT_TRUE(std::is_move_constructible<variant<std::string>>::value);
  2073. EXPECT_TRUE(std::is_move_assignable<variant<std::string>>::value);
  2074. EXPECT_TRUE(std::is_move_constructible<variant<std::unique_ptr<int>>>::value);
  2075. EXPECT_TRUE(std::is_move_assignable<variant<std::unique_ptr<int>>>::value);
  2076. EXPECT_FALSE(
  2077. std::is_copy_constructible<variant<std::unique_ptr<int>>>::value);
  2078. EXPECT_FALSE(std::is_copy_assignable<variant<std::unique_ptr<int>>>::value);
  2079. EXPECT_FALSE(
  2080. absl::is_trivially_copy_constructible<variant<std::string>>::value);
  2081. EXPECT_FALSE(absl::is_trivially_copy_assignable<variant<std::string>>::value);
  2082. #if ABSL_VARIANT_PROPAGATE_COPY_MOVE_TRIVIALITY
  2083. EXPECT_TRUE(absl::is_trivially_copy_constructible<variant<int>>::value);
  2084. EXPECT_TRUE(absl::is_trivially_copy_assignable<variant<int>>::value);
  2085. EXPECT_TRUE(is_trivially_move_constructible<variant<int>>::value);
  2086. EXPECT_TRUE(is_trivially_move_assignable<variant<int>>::value);
  2087. #endif // ABSL_VARIANT_PROPAGATE_COPY_MOVE_TRIVIALITY
  2088. }
  2089. TEST(VariantTest, TestVectorOfMoveonlyVariant) {
  2090. // Verify that variant<MoveonlyType> works correctly as a std::vector element.
  2091. std::vector<variant<std::unique_ptr<int>, std::string>> vec;
  2092. vec.push_back(absl::make_unique<int>(42));
  2093. vec.emplace_back("Hello");
  2094. vec.reserve(3);
  2095. auto another_vec = absl::move(vec);
  2096. // As a sanity check, verify vector contents.
  2097. ASSERT_EQ(2, another_vec.size());
  2098. EXPECT_EQ(42, *absl::get<std::unique_ptr<int>>(another_vec[0]));
  2099. EXPECT_EQ("Hello", absl::get<std::string>(another_vec[1]));
  2100. }
  2101. TEST(VariantTest, NestedVariant) {
  2102. #if ABSL_VARIANT_PROPAGATE_COPY_MOVE_TRIVIALITY
  2103. static_assert(absl::is_trivially_copy_constructible<variant<int>>(), "");
  2104. static_assert(absl::is_trivially_copy_assignable<variant<int>>(), "");
  2105. static_assert(is_trivially_move_constructible<variant<int>>(), "");
  2106. static_assert(is_trivially_move_assignable<variant<int>>(), "");
  2107. static_assert(absl::is_trivially_copy_constructible<variant<variant<int>>>(),
  2108. "");
  2109. static_assert(absl::is_trivially_copy_assignable<variant<variant<int>>>(),
  2110. "");
  2111. static_assert(is_trivially_move_constructible<variant<variant<int>>>(), "");
  2112. static_assert(is_trivially_move_assignable<variant<variant<int>>>(), "");
  2113. #endif // ABSL_VARIANT_PROPAGATE_COPY_MOVE_TRIVIALITY
  2114. variant<int> x(42);
  2115. variant<variant<int>> y(x);
  2116. variant<variant<int>> z(y);
  2117. EXPECT_TRUE(absl::holds_alternative<variant<int>>(z));
  2118. EXPECT_EQ(x, absl::get<variant<int>>(z));
  2119. }
  2120. struct TriviallyDestructible {
  2121. TriviallyDestructible(TriviallyDestructible&&) {}
  2122. TriviallyDestructible(const TriviallyDestructible&) {}
  2123. TriviallyDestructible& operator=(TriviallyDestructible&&) { return *this; }
  2124. TriviallyDestructible& operator=(const TriviallyDestructible&) {
  2125. return *this;
  2126. }
  2127. };
  2128. struct TriviallyMovable {
  2129. TriviallyMovable(TriviallyMovable&&) = default;
  2130. TriviallyMovable(TriviallyMovable const&) {}
  2131. TriviallyMovable& operator=(const TriviallyMovable&) { return *this; }
  2132. };
  2133. struct TriviallyCopyable {
  2134. TriviallyCopyable(const TriviallyCopyable&) = default;
  2135. TriviallyCopyable& operator=(const TriviallyCopyable&) { return *this; }
  2136. };
  2137. struct TriviallyMoveAssignable {
  2138. TriviallyMoveAssignable(TriviallyMoveAssignable&&) = default;
  2139. TriviallyMoveAssignable(const TriviallyMoveAssignable&) {}
  2140. TriviallyMoveAssignable& operator=(TriviallyMoveAssignable&&) = default;
  2141. TriviallyMoveAssignable& operator=(const TriviallyMoveAssignable&) {
  2142. return *this;
  2143. }
  2144. };
  2145. struct TriviallyCopyAssignable {};
  2146. #if ABSL_VARIANT_PROPAGATE_COPY_MOVE_TRIVIALITY
  2147. TEST(VariantTest, TestTriviality) {
  2148. {
  2149. using TrivDestVar = absl::variant<TriviallyDestructible>;
  2150. EXPECT_FALSE(is_trivially_move_constructible<TrivDestVar>::value);
  2151. EXPECT_FALSE(absl::is_trivially_copy_constructible<TrivDestVar>::value);
  2152. EXPECT_FALSE(is_trivially_move_assignable<TrivDestVar>::value);
  2153. EXPECT_FALSE(absl::is_trivially_copy_assignable<TrivDestVar>::value);
  2154. EXPECT_TRUE(absl::is_trivially_destructible<TrivDestVar>::value);
  2155. }
  2156. {
  2157. using TrivMoveVar = absl::variant<TriviallyMovable>;
  2158. EXPECT_TRUE(is_trivially_move_constructible<TrivMoveVar>::value);
  2159. EXPECT_FALSE(absl::is_trivially_copy_constructible<TrivMoveVar>::value);
  2160. EXPECT_FALSE(is_trivially_move_assignable<TrivMoveVar>::value);
  2161. EXPECT_FALSE(absl::is_trivially_copy_assignable<TrivMoveVar>::value);
  2162. EXPECT_TRUE(absl::is_trivially_destructible<TrivMoveVar>::value);
  2163. }
  2164. {
  2165. using TrivCopyVar = absl::variant<TriviallyCopyable>;
  2166. EXPECT_TRUE(is_trivially_move_constructible<TrivCopyVar>::value);
  2167. EXPECT_TRUE(absl::is_trivially_copy_constructible<TrivCopyVar>::value);
  2168. EXPECT_FALSE(is_trivially_move_assignable<TrivCopyVar>::value);
  2169. EXPECT_FALSE(absl::is_trivially_copy_assignable<TrivCopyVar>::value);
  2170. EXPECT_TRUE(absl::is_trivially_destructible<TrivCopyVar>::value);
  2171. }
  2172. {
  2173. using TrivMoveAssignVar = absl::variant<TriviallyMoveAssignable>;
  2174. EXPECT_TRUE(is_trivially_move_constructible<TrivMoveAssignVar>::value);
  2175. EXPECT_FALSE(
  2176. absl::is_trivially_copy_constructible<TrivMoveAssignVar>::value);
  2177. EXPECT_TRUE(is_trivially_move_assignable<TrivMoveAssignVar>::value);
  2178. EXPECT_FALSE(absl::is_trivially_copy_assignable<TrivMoveAssignVar>::value);
  2179. EXPECT_TRUE(absl::is_trivially_destructible<TrivMoveAssignVar>::value);
  2180. }
  2181. {
  2182. using TrivCopyAssignVar = absl::variant<TriviallyCopyAssignable>;
  2183. EXPECT_TRUE(is_trivially_move_constructible<TrivCopyAssignVar>::value);
  2184. EXPECT_TRUE(
  2185. absl::is_trivially_copy_constructible<TrivCopyAssignVar>::value);
  2186. EXPECT_TRUE(is_trivially_move_assignable<TrivCopyAssignVar>::value);
  2187. EXPECT_TRUE(absl::is_trivially_copy_assignable<TrivCopyAssignVar>::value);
  2188. EXPECT_TRUE(absl::is_trivially_destructible<TrivCopyAssignVar>::value);
  2189. }
  2190. }
  2191. #endif // ABSL_VARIANT_PROPAGATE_COPY_MOVE_TRIVIALITY
  2192. // To verify that absl::variant correctly use the nontrivial move ctor of its
  2193. // member rather than use the trivial copy constructor.
  2194. TEST(VariantTest, MoveCtorBug) {
  2195. // To simulate std::tuple in libstdc++.
  2196. struct TrivialCopyNontrivialMove {
  2197. TrivialCopyNontrivialMove() = default;
  2198. TrivialCopyNontrivialMove(const TrivialCopyNontrivialMove&) = default;
  2199. TrivialCopyNontrivialMove(TrivialCopyNontrivialMove&&) { called = true; }
  2200. bool called = false;
  2201. };
  2202. {
  2203. using V = absl::variant<TrivialCopyNontrivialMove, int>;
  2204. V v1(absl::in_place_index_t<0>{});
  2205. // this should invoke the move ctor, rather than the trivial copy ctor.
  2206. V v2(std::move(v1));
  2207. EXPECT_TRUE(absl::get<0>(v2).called);
  2208. }
  2209. {
  2210. // this case failed to compile before our fix due to a GCC bug.
  2211. using V = absl::variant<int, TrivialCopyNontrivialMove>;
  2212. V v1(absl::in_place_index_t<1>{});
  2213. // this should invoke the move ctor, rather than the trivial copy ctor.
  2214. V v2(std::move(v1));
  2215. EXPECT_TRUE(absl::get<1>(v2).called);
  2216. }
  2217. }
  2218. } // namespace
  2219. } // inline namespace lts_2018_06_20
  2220. } // namespace absl