From: Marek Polacek Date: Wed, 18 Feb 2026 20:53:01 +0000 (-0500) Subject: c++/reflection: add fixed test [PR123440] X-Git-Tag: basepoints/gcc-17~1229 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=77aedc8741d97e8946ba78397aafcbacd89890c4;p=thirdparty%2Fgcc.git c++/reflection: add fixed test [PR123440] This test crashed until r16-7330. The errors are expected. Let's make sure the crash doesn't come back. PR c++/123440 gcc/testsuite/ChangeLog: * g++.dg/reflect/extract10.C: New test. --- diff --git a/gcc/testsuite/g++.dg/reflect/extract10.C b/gcc/testsuite/g++.dg/reflect/extract10.C new file mode 100644 index 00000000000..12dc25c711f --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/extract10.C @@ -0,0 +1,55 @@ +// PR c++/123440 +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } + +#include +#include + +using namespace std::meta; + +struct test_struct +{ + int data_member; + void fn1() {} + void fn2() {} + int getter() { return data_member; } + void setter(int i) { data_member = i; } + virtual int virtual_fn(char*, bool) { return 0; } + virtual int pure_virtual_fn(char*, int) = 0; + static int static_member_fn(bool b) { return b ? 42 : 0; } +}; +template +consteval info get_member_at() +{ + constexpr auto ctx = access_context::current(); + constexpr auto pointable = [](info i) consteval -> bool { + return !is_destructor(i) && !is_constructor(i) && !is_special_member_function(i); + }; + return (members_of(^^T, ctx) | std::views::filter(pointable) | std::ranges::to())[I]; +} +template +consteval info get_member_type() { + return type_of(get_member_at()); +} +template +consteval auto get_member_ptr() { + constexpr info member = get_member_at(); + constexpr info mem_type = add_pointer(get_member_type()); + using type = typename[: mem_type :]; + return extract(member); +} +constexpr auto ex_0 = extract(get_member_at()); +constexpr auto ex_1 = extract(get_member_at()); +constexpr auto ex_2 = extract(get_member_at()); +constexpr auto ex_3 = extract(get_member_at()); +constexpr auto ex_4 = extract(get_member_at()); +constexpr auto ex_5 = extract(get_member_at()); +constexpr auto ex_6 = extract(get_member_at()); +constexpr auto ex_7 = extract(get_member_at()); +constexpr auto ex_8 = get_member_ptr(); +constexpr auto test_1 = get_member_ptr(); // { dg-error "value cannot be extracted" } +constexpr auto test_2 = get_member_ptr(); // { dg-error "value cannot be extracted" } +constexpr auto test_3 = get_member_ptr(); // { dg-error "value cannot be extracted" } +constexpr auto test_4 = get_member_ptr(); // { dg-error "value cannot be extracted" } +constexpr auto test_5 = get_member_ptr(); // { dg-error "value cannot be extracted" } +constexpr auto test_6 = get_member_ptr(); // { dg-error "value cannot be extracted" }