aboutsummaryrefslogtreecommitdiff
path: root/mlir/lib/Bytecode/Reader/BytecodeReader.cpp
diff options
context:
space:
mode:
authorKrystian Stasiowski <sdkrystian@gmail.com>2024-07-03 18:19:58 -0400
committerGitHub <noreply@github.com>2024-07-03 18:19:58 -0400
commit10b43f429a9f5cc7315c5b0490433647c9a93493 (patch)
tree1837bca91ff82eea02a9baf47f61f23e0d110852 /mlir/lib/Bytecode/Reader/BytecodeReader.cpp
parent7d68d9d2f27535e03934383220282e18edd0c1e8 (diff)
downloadllvm-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