mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
The following patch attempts to implement LWG4483. As written in the approved resolution, some checks are done on strip_array_types (valuet) rather than on valuet and one is skipped. Tomasz on IRC reasoned why input_range should otherwise already ensure we see similar type, so just for the possibility of fuzzed <meta> the patch adds some verification. And as the array cases are contiguous, instead of actually recursing (for which we'd need to have lvalue of the *it rather than prvalue) it just walks the CONSTRUCTORs for the arrays and handles the elts in there recursively. The <meta> changes do exactly what the LWG4483 change says to do. 2026-04-15 Jakub Jelinek <jakub@redhat.com> * reflect.cc (adjust_array_elt): New function. (get_range_elts): Implement LWG4483 - Multidimensional arrays are not supported by meta::reflect_constant_array and related functions. Handle ARRAY_TYPE valuet. Don't unshare_expr in the class valuet case, get_template_param_object will unshare. * g++.dg/reflect/reflect_constant_array9.C: New test. * g++.dg/reflect/reflect_constant_array10.C: New test. * g++.dg/reflect/reflect_constant_array11.C: New test. * g++.dg/reflect/define_static_array6.C: New test. * g++.dg/reflect/define_static_object2.C: Uncomment older tests and fix them, add tests for unions. * include/std/meta (define_static_object): Adjust for LWG4483 changes - handle unions and arrays differently. Reviewed-by: Jason Merrill <jason@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com>