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

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2024-07-24
             Status|RESOLVED                    |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |ppalka at gcc dot 
gnu.org
     Ever confirmed|0                           |1
         Resolution|INVALID                     |---
                 CC|                            |jason at gcc dot gnu.org,
                   |                            |ppalka at gcc dot gnu.org

--- Comment #4 from Patrick Palka <ppalka at gcc dot gnu.org> ---
FWIW -fdelayed-template-parsing seems to originally have been introduced as an
MSVC compatibility flag:
https://clang.llvm.org/docs/MSVCCompatibility.html#template-instantiation-and-name-lookup

It can change the meaning of valid code since it causes unqualified lookup to
be performed from the point of instantiation instead of from the template
definition:

  int g(long) { return 0; }

  template<class T>
  int f() { return g(0); }

  int g(int) { return 1; }

  int main() {
    return f<int>(); // returns 1 with -fdelayed-template-parsing, 0 without
  }

That it also suppresses errors inside uninstantiated templates seems to be a
convenient coincidence, so it doesn't seem to be an ideal workaround.

I'm going to try downgrading these name lookup errors into permerrors when
inside an uninstantiated template, so that they can be worked around by passing
-fpermissive (which doesn't change the meaning of valid code).

Reply via email to