// RUN: %clang_cc1 -std=c++2a -emit-llvm-only -Wno-unused-value %s -verify // expected-no-diagnostics struct A { consteval A operator+() { return {}; } }; consteval A operator~(A) { return {}; } consteval A operator+(A, A) { return {}; } template void f() { A a; A b = ~a; A c = a + a; A d = +a; } template void f(); template void foo() { T a; T b = ~a; T c = a + a; T d = +a; } template void foo(); template struct B { DataT D; }; template consteval B operator+(B lhs, B rhs) { return B{lhs.D + rhs.D}; } template consteval T template_add(T a, T b) { return a + b; } consteval B non_template_add(B a, B b) { return a + b; } void bar() { constexpr B a{}; constexpr B b{}; auto constexpr c = a + b; } static_assert((template_add(B{7}, B{3})).D == 10); static_assert((non_template_add(B{7}, B{3})).D == 10);