brintos

brintos / llvm-project-archived public Read only

0
0
Text · 986 B · addb4d6 Raw
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