https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119453
Bug ID: 119453
Summary: Dependent name instantiation seems should not be
delayed inside 'noexcept' field of friend function
declaration
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: accepts-invalid
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: rush102333 at gmail dot com
Target Milestone: ---
With the following code, gcc does not produce any error until the friend
function 'foo' is called:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template <typename T> struct S {
friend void foo (S) noexcept(T::error) {}
};
//Does not fire
S<int> t;
//Fires
//void g() { foo(t); }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
https://godbolt.org/z/c5MYoc9EK
I'm not sure but there might be some questions because the error appears right
after the instantiation of 'S' in case of default function argument:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template <typename T> struct S {
friend void foo (S, int a = T::error) {}
};
//Fires here
S<int> t;
//void g() { foo(t); }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
https://godbolt.org/z/q5zqsEd5s
It appears that delayed instantiation of default arguments applies only to
member functions and function templates
(https://eel.is/c++draft/temp#decls.general-3), and a friend function of a
class template is neither, so the corresponding dependent names should be
instantiated with the class.
Please see the discussion on LLVM bug tracker:
https://github.com/llvm/llvm-project/issues/96753