diff options
| author | Krystian Stasiowski <sdkrystian@gmail.com> | 2024-07-03 18:19:58 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-03 18:19:58 -0400 |
| commit | 10b43f429a9f5cc7315c5b0490433647c9a93493 (patch) | |
| tree | 1837bca91ff82eea02a9baf47f61f23e0d110852 /mlir/lib/Bytecode/Reader/BytecodeReader.cpp | |
| parent | 7d68d9d2f27535e03934383220282e18edd0c1e8 (diff) | |
| download | llvm-10b43f429a9f5cc7315c5b0490433647c9a93493.zip llvm-10b43f429a9f5cc7315c5b0490433647c9a93493.tar.gz llvm-10b43f429a9f5cc7315c5b0490433647c9a93493.tar.bz2 | |
[Clang][Sema] Correctly transform dependent operands of overloaded binary operator& (#97596)
Currently, `TreeTransform::TransformCXXOperatorCallExpr` calls
`TreeTransform::TransformAddressOfOperand` to transform the first
operand of a `CXXOperatorCallExpr` when its `OverloadOperatorKind` is
`OO_Amp` -- regardless of arity. This results in the first operand of
binary `operator&` being incorrectly transformed as if it was the
operand of the address of operator in cases such as the following:
```
struct A {
int x;
};
void operator&(A, A);
template<typename T>
struct B {
int f() {
return T::x & 1; // invalid reference to 'A::x' is not diagnosed because 'T::x' is incorrectly transformed as if it was the operand of unary operator&
}
};
template struct B<A>;
```
Prior to #92318 we would build a `CXXDependentScopeMemberExpr` for
`T::x` (as with most dependent qualified names that were not member
qualified names). Since `TreeTransform::TransformAddressOfOperand` only
differs from `TransformExpr` for `DependentScopeDeclRefExpr` and
`UnresolvedLookupExpr` operands, `T::x` was transformed "correctly". Now
that we build a `DependentScopeDeclRefExpr` for `T::x`, it is
incorrectly transformed as if it was the operand of the address of
operator and we fail to diagnose the invalid reference to a non-static
data member. This patch fixes the issue by only calling
`TreeTransform::TransformAddressOfOperand` for `CXXOperatorCallExpr`s
with a single operand. This fixes #97483.
Diffstat (limited to 'mlir/lib/Bytecode/Reader/BytecodeReader.cpp')
0 files changed, 0 insertions, 0 deletions
