sdkrystian wrote:

@erichkeane the most recent commit results in the following:
```cpp
template<typename T> void f(T);
void g() { }

template<typename T>
struct A {
  // error: cannot declare an explicit specialization in a friend
  template<> friend void f<>(T) { }
  // error: friend function specialization cannot be defined
  friend void f<>(T) { }
  // error: cannot declare an explicit specialization in a friend
  template<> friend void ::g() { }
  // error: friend function definition cannot be qualified with '::'
  friend void ::g() { }
};

void h() {
  void i();
  struct B {
    // error: templates can only be declared in namespace or class scope
    // error: cannot declare an explicit specialization in a friend
    template<> friend void i() { }
    // error: friend function cannot be defined in a local class
    friend void i() { }
  };
}
```
Unrelated, but it also seems that `template<> friend void f<>(T) { }` causes 
[this 
assert](https://github.com/llvm/llvm-project/blob/main/clang/lib/Sema/SemaDecl.cpp#L10477)
 to fire. This happens because we clear `HasExplicitTemplateArgs` for invalid 
declarations 
[here](https://github.com/llvm/llvm-project/blob/main/clang/lib/Sema/SemaDecl.cpp#L10427).
 I could include a fix, but it might fall outside the scope of this PR.

I also added a release note as requested.

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

Reply via email to