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