Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/cpp1z/fold2.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
// { dg-do compile { target c++17 } } // { dg-options "" } // Check that we can fold over all of the operators required // by the standard in every possible way. #define COMMA , #define MAKE_FNS(name, op) \ template<typename... Ts> \ auto unary_left_ ## name (Ts... ts) { return (... op ts); } \ template<typename... Ts> \ auto unary_right_ ## name (Ts... ts) { return (ts op ...); } \ template<typename T, typename... Ts> \ auto binary_left_ ## name (T x, Ts... ts) { return (x op ... op ts); } \ template<typename T, typename... Ts> \ auto binary_right_ ## name (T x, Ts... ts) { return (ts op ... op x); } // TODO: These are compile-only tests... #define CHECK_FN(name) \ unary_left_ ## name (a); \ unary_left_ ## name (a, b, c); \ unary_right_ ## name (a); \ unary_right_ ## name (a, b, c); \ binary_left_ ## name (a); \ binary_left_ ## name (a, b, c, d); \ binary_right_ ## name (d); \ binary_right_ ## name (d, a, b, c); MAKE_FNS (add, +); MAKE_FNS (sub, -); MAKE_FNS (mul, *); MAKE_FNS (div, /); MAKE_FNS (mod, %); MAKE_FNS (bxor, ^); MAKE_FNS (bor, |); MAKE_FNS (band, &); MAKE_FNS (lsh, <<); MAKE_FNS (rsh, >>); MAKE_FNS (assign, =); MAKE_FNS (addi, +=); MAKE_FNS (subi, -=); MAKE_FNS (muli, *=); MAKE_FNS (divi, /=); MAKE_FNS (modi, %=); MAKE_FNS (bxori, ^=); MAKE_FNS (bori, |=); MAKE_FNS (bandi, &=); MAKE_FNS (lshi, <<=); MAKE_FNS (rshi, >>=); MAKE_FNS (eq, ==); MAKE_FNS (ne, !=); MAKE_FNS (lt, <); MAKE_FNS (gt, >); MAKE_FNS (le, <=); MAKE_FNS (ge, >=); MAKE_FNS (land, &&); MAKE_FNS (lor, ||); MAKE_FNS (comma, COMMA); MAKE_FNS (dot_star, .*); MAKE_FNS (arrow_star, ->*); int main() { int a = 0, b = 0, c = 0, d = 0; CHECK_FN (add); CHECK_FN (sub); CHECK_FN (mul); CHECK_FN (div); CHECK_FN (mod); CHECK_FN (bxor); CHECK_FN (bor); CHECK_FN (band); CHECK_FN (lsh); CHECK_FN (rsh); // CHECK_FN (assign); CHECK_FN (addi); CHECK_FN (subi); CHECK_FN (muli); CHECK_FN (divi); CHECK_FN (modi); CHECK_FN (bxori); CHECK_FN (bori); CHECK_FN (bandi); CHECK_FN (lshi); CHECK_FN (rshi); CHECK_FN (eq); CHECK_FN (ne); CHECK_FN (lt); CHECK_FN (gt); CHECK_FN (le); CHECK_FN (ge); CHECK_FN (eq); CHECK_FN (ne); CHECK_FN (comma); struct X { int a; } x, *px = &x; int X::* pm = &X::a; unary_left_arrow_star (px, pm); // px ->* pm unary_right_arrow_star (px, pm); // px ->* pm binary_left_arrow_star (px, pm); // px ->* pm binary_right_arrow_star (pm, px); // px ->* pm unary_left_dot_star (x, pm); // x ->* pm unary_right_dot_star (x, pm); // x ->* pm binary_left_dot_star (x, pm); // x ->* pm binary_right_dot_star (pm, x); // x ->* pm }