Remove `friend` Declarations from HLSL
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
HLSL disallows all uses of the `friend` keyword. Clang must diagnose every form of `friend` declaration in HLSL shader code.
## HLSL Context
The `friend` keyword is tightly coupled with C++ access control (private/protected members), user-defined constructors, and class encapsulation — all features that are restricted or removed in HLSL. Since there is no meaningful access control in HLSL types, `friend` declarations have no defined semantics in the HLSL specification.
## Current Behavior in Clang
`friend` declarations in HLSL mode are currently accepted without any HLSL-specific diagnostic.
See example: https://godbolt.org/z/Yoz9dWTj3
## Forms That Must Be Diagnosed
The following are all legal C++ but must be errors in HLSL:
**Friend class declaration**
```cpp
struct Bar {};
struct Foo {
friend Bar; // grants Bar access to Foo's private members
};
```
**Friend function declaration**
```cpp
struct Foo {
friend void helper(Foo f); // declares a non-member friend function
};
```
**Inline friend function definition**
```cpp
struct Vec2 {
float x, y;
friend Vec2 operator+(Vec2 a, Vec2 b) { // defined inline inside the class
return {a.x + b.x, a.y + b.y};
}
};
```
**Friend template class**
```cpp
template
struct Handle {
template
friend struct Handle; // all specialisations of Handle are friends of each other
};
```
**Friend template function**
```cpp
template
struct Wrapper {
template
friend bool operator==(Wrapper a, Wrapper b);
};
```
**Friend declaration granting access to a private member**
```cpp
struct Secret {
private:
int value;
friend int reveal(Secret s); // reveal() can read Secret::value
};
```
## Required Changes in Clang
### Diagnostic
Use a shared `err_hlsl_unsupported_feature` diagnostic (parameterized by feature name) rather than adding a per-feature entry to `DiagnosticSemaKinds.td`.
### Sema Check
In `SemaDecl.cpp` or `SemaHLSL.cpp`, when any `FriendDecl` is processed in HLSL mode, emit the diagnostic:
```cpp
if (getLangOpts().HLSL)
Diag(FriendLoc, diag::err_hlsl_unsupported_feature) << "friend declarations";
```
This single check covers all forms — friend class declarations, friend function declarations, inline friend function definitions, and friend templates.
### Test
Add a test to `clang/test/SemaHLSL/` verifying that each of the forms above produces the diagnostic.
Contributor guide
Assessment
This issue has not been assessed yet.