xref: /llvm-project/clang/test/SemaCXX/consteval-operators.cpp (revision a1e5430b6adfe0fe19d831ab719fbec05b2cf5b7)
1 // RUN: %clang_cc1 -std=c++2a -emit-llvm-only -Wno-unused-value %s -verify
2 
3 // expected-no-diagnostics
4 
5 struct A {
operator +A6   consteval A operator+() { return {}; }
7 };
operator ~(A)8 consteval A operator~(A) { return {}; }
operator +(A,A)9 consteval A operator+(A, A) { return {}; }
10 
f()11 template <class> void f() {
12   A a;
13   A b = ~a;
14   A c = a + a;
15   A d = +a;
16 }
17 template void f<int>();
18 
foo()19 template <class T> void foo() {
20   T a;
21   T b = ~a;
22   T c = a + a;
23   T d = +a;
24 }
25 
26 template void foo<A>();
27 
28 template <typename DataT> struct B { DataT D; };
29 
30 template <typename DataT>
operator +(B<DataT> lhs,B<DataT> rhs)31 consteval B<DataT> operator+(B<DataT> lhs, B<DataT> rhs) {
32   return B<DataT>{lhs.D + rhs.D};
33 }
34 
template_add(T a,T b)35 template <class T> consteval T template_add(T a, T b) { return a + b; }
36 
non_template_add(B<int> a,B<int> b)37 consteval B<int> non_template_add(B<int> a, B<int> b) { return a + b; }
38 
bar()39 void bar() {
40   constexpr B<int> a{};
41   constexpr B<int> b{};
42   auto constexpr c = a + b;
43 }
44 
45 static_assert((template_add(B<int>{7}, B<int>{3})).D == 10);
46 static_assert((non_template_add(B<int>{7}, B<int>{3})).D == 10);
47