[Bug c++/126343] [reflection] type_of not working properly on reflection of info-typed object

"cvs-commit at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126343

--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-16 branch has been updated by Jakub Jelinek
<[email protected]>:

https://gcc.gnu.org/g:c68a5d17726fe3b57bcea127d21bf71ff53794a3

commit r16-9472-gc68a5d17726fe3b57bcea127d21bf71ff53794a3
Author: Jakub Jelinek <[email protected]>
Date:   Fri Jul 31 08:37:18 2026 +0200

    c++: Improve diagnostics for nullptr_t/info [PR126343]

    We currently print std::nullptr_t or std::meta::info in diagnostics
    when seeing a NULLPTR_TYPE or META_TYPE, when they aren't type aliases
    (or when they are exactly those type aliases).
    I think that isn't a bad idea, the aliases is what users usually
    use for those.  There are 2 problems with this though.
    We print
    decltype(nullptr)
    and
    decltype(nullptr) const volatile
    exactly the same, both as std::nullptr_t, so the qualifiers are lost.
    And, e.g. in case of a static assertion failure when people want to find
    out why some reflections aren't equal we can print
    note: the comparison reduces to '(^^std::meta::info == ^^std::meta:info)'
    and the user then has no idea what is going on.  Is it because one of
    those is a type alias (which one), or because of cv-qual differences,
    or both?
    The following patch prints the aliases in normal %qT etc. printing,
    if cv qualified prints qualifications after them (so e.g.
    'std::nullptr_t const' or 'std::meta::info volatile').
    And, when printing a reflection expression, it differentiates even
    between the type alias case and non-alias, so for non-aliases prints
    'decltype(nullptr)' or 'decltype(^^int) const volatile' etc.

    2026-07-31  Jakub Jelinek  <[email protected]>

            PR c++/126343
            * error.cc (dump_type) <case NULLPTR_TYPE>: Call
            pp_c_type_qualifier_list.
            (dump_type) <case META_TYPE>: Likewise.
            (dump_expr) <case REFLECT_EXPR>: For REFLECT_EXPR on
            non-typedef META_TYPE or NULLPTR_TYPE print
            decltype(^^int) or decltype(nullptr).

            * g++.dg/reflect/pr126343.C: New test.
            * g++.dg/reflect/diag6.C: Adjust expected diagnostic wording.
            * g++.dg/reflect/init2.C: Likewise.
            * g++.dg/cpp0x/pr124489.C: Likewise.

    Reviewed-by: Jason Merrill <[email protected]>
    (cherry picked from commit 525494c18742ef917ef046584af6dd78f713a449)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.