llvm / llvm/llvm-project

Remove `friend` Declarations from HLSL

Open
#203,374 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.