Skip to content

Commit 092e3ee

Browse files
committed
Add checks for void* in get_reference_argument
1 parent 080f0c1 commit 092e3ee

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
.vscode
2-
build
2+
build*

src/rttr/detail/type/type_register.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class RTTR_API type_register
128128

129129
private:
130130

131-
friend class type;
131+
friend class rttr::type;
132132
template<typename T>
133133
friend class class_;
134134

src/rttr/detail/variant/variant_data_policy.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,25 @@ enable_if_t<is_wrapper<T>::value && !is_dereferenceable<Tp>::value, argument> ge
230230
/////////////////////////////////////////////////////////////////////////////////////////
231231

232232
template<typename T>
233-
enable_if_t<!is_wrapper<T>::value &&
234-
is_dereferenceable<T>::value, argument> get_reference_argument(T& value)
235-
{
233+
enable_if_t< !is_wrapper<T>::value && is_dereferenceable<T>::value &&
234+
!std::is_void<typename std::remove_pointer<T>::type>::value, argument> get_reference_argument(T& value)
235+
{
236236
return argument(*value);
237237
}
238238

239239
/////////////////////////////////////////////////////////////////////////////////////////
240240

241+
template<typename T>
242+
enable_if_t<!is_wrapper<T>::value && is_dereferenceable<T>::value &&
243+
std::is_void<typename std::remove_pointer<T>::type>::value, argument> get_reference_argument(T& value)
244+
{
245+
// This is specifically for the scenario when T is void*. And since we cannot actually do anything
246+
// meaningful with a void* variable we will just return an empty argument.
247+
return argument();
248+
}
249+
250+
/////////////////////////////////////////////////////////////////////////////////////////
251+
241252
template<typename T>
242253
enable_if_t<!is_wrapper<T>::value &&
243254
!is_dereferenceable<T>::value, argument> get_reference_argument(T& value)

src/unit_tests/variant/variant_misc_test.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,18 @@ TEST_CASE("variant - get_reference_argument ")
223223
CHECK(arg.get_type().is_wrapper() == false);
224224
CHECK(arg.get_type().is_pointer() == false);
225225
REQUIRE(arg.get_type() == rttr::type::get<simple_type>());
226+
227+
228+
/////////////////////////////////////////////////////////////////////////////////////////
229+
void* voidPtr = value.get();
230+
var = voidPtr;
231+
arg = var.extract_reference_argument();
232+
233+
// works with pointers
234+
CHECK(var.get_type().is_wrapper() == false);
235+
CHECK(var.get_type().is_pointer() == true);
236+
CHECK(arg.get_type().is_wrapper() == false);
237+
CHECK(arg.get_type().is_pointer() == false);
226238
}
227239

228240
/////////////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)