================ @@ -2252,6 +2252,176 @@ TEST_F(StructuralEquivalenceStmtTest, UnaryOperatorDifferentOps) { EXPECT_FALSE(testStructuralMatch(t)); } +TEST_F(StructuralEquivalenceStmtTest, + CXXOperatorCallExprVsUnaryBinaryOperator) { + auto t = makeNamedDecls( + R"( + template <typename T, T x> + class A; + template <typename T, T x, T y> + void foo( + A<T, x + y>, + A<T, x - y>, + A<T, -x>, + A<T, x * y>, + A<T, *x>, + A<T, x / y>, + A<T, x % y>, + A<T, x ^ y>, + A<T, x & y>, + A<T, &x>, + A<T, x | y>, + A<T, ~x>, + A<T, !x>, + A<T, x < y>, + A<T, (x > y)>, + A<T, x << y>, + A<T, (x >> y)>, + A<T, x == y>, + A<T, x != y>, + A<T, x <= y>, + A<T, x >= y>, + A<T, x <=> y>, + A<T, x && y>, + A<T, x || y>, + A<T, ++x>, + A<T, --x>, + A<T, (x , y)>, + A<T, x ->* y>, + A<T, x -> y> + ); + )", + R"( + struct Bar { + Bar& operator=(Bar&); + Bar& operator->(); + }; + + Bar& operator+(Bar&, Bar&); + Bar& operator+(Bar&); + Bar& operator-(Bar&, Bar&); + Bar& operator-(Bar&); + Bar& operator*(Bar&, Bar&); + Bar& operator*(Bar&); + Bar& operator/(Bar&, Bar&); + Bar& operator%(Bar&, Bar&); + Bar& operator^(Bar&, Bar&); + Bar& operator&(Bar&, Bar&); + Bar& operator&(Bar&); + Bar& operator|(Bar&, Bar&); + Bar& operator~(Bar&); + Bar& operator!(Bar&); + Bar& operator<(Bar&, Bar&); + Bar& operator>(Bar&, Bar&); + Bar& operator+=(Bar&, Bar&); + Bar& operator-=(Bar&, Bar&); + Bar& operator*=(Bar&, Bar&); + Bar& operator/=(Bar&, Bar&); + Bar& operator%=(Bar&, Bar&); + Bar& operator^=(Bar&, Bar&); + Bar& operator&=(Bar&, Bar&); + Bar& operator|=(Bar&, Bar&); + Bar& operator<<(Bar&, Bar&); + Bar& operator>>(Bar&, Bar&); + Bar& operator<<=(Bar&, Bar&); + Bar& operator>>=(Bar&, Bar&); + Bar& operator==(Bar&, Bar&); + Bar& operator!=(Bar&, Bar&); + Bar& operator<=(Bar&, Bar&); + Bar& operator>=(Bar&, Bar&); + Bar& operator<=>(Bar&, Bar&); + Bar& operator&&(Bar&, Bar&); + Bar& operator||(Bar&, Bar&); + Bar& operator++(Bar&); + Bar& operator--(Bar&); + Bar& operator,(Bar&, Bar&); + Bar& operator->*(Bar&, Bar&); + + template <typename T, T x> + class A; + template <typename T, T x, T y> + void foo( + A<T, x + y>, + A<T, x - y>, + A<T, -x>, + A<T, x * y>, + A<T, *x>, + A<T, x / y>, + A<T, x % y>, + A<T, x ^ y>, + A<T, x & y>, + A<T, &x>, + A<T, x | y>, + A<T, ~x>, + A<T, !x>, + A<T, x < y>, + A<T, (x > y)>, + A<T, x << y>, + A<T, (x >> y)>, + A<T, x == y>, + A<T, x != y>, + A<T, x <= y>, + A<T, x >= y>, + A<T, x <=> y>, + A<T, x && y>, + A<T, x || y>, + A<T, ++x>, + A<T, --x>, + A<T, (x , y)>, + A<T, x ->* y>, + A<T, x -> y> + ); + )", + Lang_CXX20); + EXPECT_TRUE(testStructuralMatch(t)); +} + +TEST_F(StructuralEquivalenceStmtTest, + CXXOperatorCallExprVsUnaryBinaryOperatorNe) { + auto t = makeNamedDecls( + R"( + template <typename T, T x> + class A; + template <typename T, T x, T y> + void foo( + A<T, x + y> + ); + )", + R"( + struct Bar; + + Bar& operator+(Bar&, Bar&); ---------------- DonatNagyE wrote:
Why is the presence of this `operator+` relevant if this TU doesn't use `operator+` at all? https://github.com/llvm/llvm-project/pull/72242 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits