================
@@ -185,3 +185,27 @@ template<typename T> struct S {
   friend void X::f(T::type);
 };
 }
+
+namespace GH113324 {
+template <typename = int> struct ct {
+  friend void f1(ct, int = 0);               // expected-error {{friend 
declaration specifying a default argument must be a definition}}
+  friend void f2(ct a, ct = decltype(a){ }); // expected-error {{friend 
declaration specifying a default argument must be a definition}}
+};
+
+template<typename T>
+class C {
+public:
+  friend void foo(T a = 1); // expected-error {{friend declaration specifying 
a default argument must be a definition}}
+};
+
+template<typename T>
+void foo(T a) { } // expected-note {{candidate function template not viable: 
requires single argument 'a', but no arguments were provided}}
+
+void test() {
+  f1(ct<>{});
+  f2(ct<>{});
+
+  C<int> c;
+  foo(); // expected-error {{no matching function for call to 'foo'}}
----------------
mizvekov wrote:

The test I had in mind was something like:
```C++
template<class T> using alias = int;

template<typename T> struct C {
  friend void foo(C, int a = alias<T&>(1));
};

void test() {
  foo(C<void>());
}
```

With your previous patch, we would be able to diagnose the instantiation 
failure here (forming reference to void), while the current version of the 
patch doesn't, since it skips instantiation of the default argument.

https://github.com/llvm/llvm-project/pull/113777
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to