https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127349

--- Comment #1 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Marek Polacek <[email protected]>:

https://gcc.gnu.org/g:3f18211853985a2bedc1621c999c2ac97b184333

commit r17-4232-g3f18211853985a2bedc1621c999c2ac97b184333
Author: Marek Polacek <[email protected]>
Date:   Fri Sep 11 21:28:32 2026 -0400

    c++/reflection: wrong lookup of template in spliced ns [PR127349]

    In

      template<class> struct Y {};
      namespace N { }

      template<auto ns>
      void f () {
        typename [:ns:]::template Y<int> b;   // #1
      }
      void g () { f<^^N>(); }

    no error is given for #1.  The problem is that we do lookup_template_class
    first which does:

          push_decl_namespace (context);
          templ = lookup_name (d1, LOOK_where::NAMESPACE, LOOK_want::NORMAL);
          pop_decl_namespace ();

    which is an unqualified lookup that goes out through the enclosing
    namespaces.  We should do a qualified lookup in N only.  This patch
    makes us use lookup_qualified_name to find the TEMPLATE_DECL and then
    pass that to lookup_template_class with a null context.

    We already have a call to lookup_qualified_name so I just shuffled
    the code a bit.  Also guard the qualified_name_lookup_error call
    with a complain check.  And give an error if we didn't get a type
    for the cp_build_qualified_type call.

    Note that the UNBOUND_CLASS_TEMPLATE case will also need something
    similar.

    The diagnostic for t9 is currently technically imprecise because
    fn is a function template; we should say that it isn't a type template
    instead.

            PR c++/127349

    gcc/cp/ChangeLog:

            * pt.cc (lookup_template_class): Print %qE if d1 is not a type.
            (tsubst) <case TYPENAME_TYPE>: Do lookup_qualified_name first
            before lookup_template_class.  Guard qualified_name_lookup_error
            with a complain check.  Use gcc_checking_assert instead of
            gcc_assert.  Use identifier_p.  Give an error if we didn't get
            a type.

    gcc/testsuite/ChangeLog:

            * g++.dg/reflect/ns7.C: New test.

    Reviewed-by: Jason Merrill <[email protected]>

Reply via email to