|  | // Copyright (C) 2009-2022 Free Software Foundation, Inc. | 
|  | // | 
|  | // This file is part of the GNU ISO C++ Library.  This library is free | 
|  | // software; you can redistribute it and/or modify it under the | 
|  | // terms of the GNU General Public License as published by the | 
|  | // Free Software Foundation; either version 3, or (at your option) | 
|  | // any later version. | 
|  |  | 
|  | // This library is distributed in the hope that it will be useful, | 
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | // GNU General Public License for more details. | 
|  |  | 
|  | // You should have received a copy of the GNU General Public License along | 
|  | // with this library; see the file COPYING3.  If not see | 
|  | // <http://www.gnu.org/licenses/>. | 
|  |  | 
|  | // { dg-require-effective-target dfp } | 
|  |  | 
|  | // ISO/IEC TR 24733  3.2.2.6  Compound assignment (decimal32). | 
|  | // ISO/IEC TR 24733  3.2.3.6  Compound assignment (decimal64). | 
|  | // ISO/IEC TR 24733  3.2.4.6  Compound assignment (decimal128). | 
|  |  | 
|  | // Access member functions directly. | 
|  |  | 
|  | #include <decimal/decimal> | 
|  | #include <testsuite_hooks.h> | 
|  |  | 
|  | using namespace std::decimal; | 
|  |  | 
|  | decimal32 d32 (5); | 
|  | decimal64 d64 (-10); | 
|  | decimal128 d128 (25); | 
|  | int si = -2; | 
|  | unsigned int ui = 5; | 
|  | long sl = -10; | 
|  | unsigned long ul = 20; | 
|  | long long sll = -25; | 
|  | unsigned long long ull = 50; | 
|  |  | 
|  | void | 
|  | compound_assignment_add_32 (void) | 
|  | { | 
|  | decimal32 a (1000), b; | 
|  |  | 
|  | b = a; b.operator+=(d32);  VERIFY (b == 1005); | 
|  | b = a; b.operator+=(d64);  VERIFY (b == 990); | 
|  | b = a; b.operator+=(d128); VERIFY (b == 1025); | 
|  | b = a; b.operator+=(si);   VERIFY (b == 998); | 
|  | b = a; b.operator+=(ui);   VERIFY (b == 1005); | 
|  | b = a; b.operator+=(sl);   VERIFY (b == 990); | 
|  | b = a; b.operator+=(ul);   VERIFY (b == 1020); | 
|  | b = a; b.operator+=(sll);  VERIFY (b == 975); | 
|  | b = a; b.operator+=(ull);  VERIFY (b == 1050); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_subtract_32 (void) | 
|  | { | 
|  | decimal32 a (1000), b; | 
|  |  | 
|  | b = a; b.operator-=(d32);  VERIFY (b == 995); | 
|  | b = a; b.operator-=(d64);  VERIFY (b == 1010); | 
|  | b = a; b.operator-=(d128); VERIFY (b == 975); | 
|  | b = a; b.operator-=(si);   VERIFY (b == 1002); | 
|  | b = a; b.operator-=(ui);   VERIFY (b == 995); | 
|  | b = a; b.operator-=(sl);   VERIFY (b == 1010); | 
|  | b = a; b.operator-=(ul);   VERIFY (b == 980); | 
|  | b = a; b.operator-=(sll);  VERIFY (b == 1025); | 
|  | b = a; b.operator-=(ull);  VERIFY (b == 950); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_multiply_32 (void) | 
|  | { | 
|  | decimal32 a (1000), b; | 
|  |  | 
|  | b = a; b.operator*=(d32);  VERIFY (b == 5000); | 
|  | b = a; b.operator*=(d64);  VERIFY (b == -10000); | 
|  | b = a; b.operator*=(d128); VERIFY (b == 25000); | 
|  | b = a; b.operator*=(si);   VERIFY (b == -2000); | 
|  | b = a; b.operator*=(ui);   VERIFY (b == 5000); | 
|  | b = a; b.operator*=(sl);   VERIFY (b == -10000); | 
|  | b = a; b.operator*=(ul);   VERIFY (b == 20000); | 
|  | b = a; b.operator*=(sll);  VERIFY (b == -25000); | 
|  | b = a; b.operator*=(ull);  VERIFY (b == 50000); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_divide_32 (void) | 
|  | { | 
|  | decimal32 a (1000), b; | 
|  |  | 
|  | b = a; b.operator/=(d32);  VERIFY (b == 200); | 
|  | b = a; b.operator/=(d64);  VERIFY (b == -100); | 
|  | b = a; b.operator/=(d128); VERIFY (b == 40); | 
|  | b = a; b.operator/=(si);   VERIFY (b == -500); | 
|  | b = a; b.operator/=(ui);   VERIFY (b == 200); | 
|  | b = a; b.operator/=(sl);   VERIFY (b == -100); | 
|  | b = a; b.operator/=(ul);   VERIFY (b == 50); | 
|  | b = a; b.operator/=(sll);  VERIFY (b == -40); | 
|  | b = a; b.operator/=(ull);  VERIFY (b == 20); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_add_64 (void) | 
|  | { | 
|  | decimal64 a (1000), b; | 
|  |  | 
|  | b = a; b.operator+=(d32);  VERIFY (b == 1005); | 
|  | b = a; b.operator+=(d64);  VERIFY (b == 990); | 
|  | b = a; b.operator+=(d128); VERIFY (b == 1025); | 
|  | b = a; b.operator+=(si);   VERIFY (b == 998); | 
|  | b = a; b.operator+=(ui);   VERIFY (b == 1005); | 
|  | b = a; b.operator+=(sl);   VERIFY (b == 990); | 
|  | b = a; b.operator+=(ul);   VERIFY (b == 1020); | 
|  | b = a; b.operator+=(sll);  VERIFY (b == 975); | 
|  | b = a; b.operator+=(ull);  VERIFY (b == 1050); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_subtract_64 (void) | 
|  | { | 
|  | decimal64 a (1000), b; | 
|  |  | 
|  | b = a; b.operator-=(d32);  VERIFY (b == 995); | 
|  | b = a; b.operator-=(d64);  VERIFY (b == 1010); | 
|  | b = a; b.operator-=(d128); VERIFY (b == 975); | 
|  | b = a; b.operator-=(si);   VERIFY (b == 1002); | 
|  | b = a; b.operator-=(ui);   VERIFY (b == 995); | 
|  | b = a; b.operator-=(sl);   VERIFY (b == 1010); | 
|  | b = a; b.operator-=(ul);   VERIFY (b == 980); | 
|  | b = a; b.operator-=(sll);  VERIFY (b == 1025); | 
|  | b = a; b.operator-=(ull);  VERIFY (b == 950); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_multiply_64 (void) | 
|  | { | 
|  | decimal64 a (1000), b; | 
|  |  | 
|  | b = a; b.operator*=(d32);  VERIFY (b == 5000); | 
|  | b = a; b.operator*=(d64);  VERIFY (b == -10000); | 
|  | b = a; b.operator*=(d128); VERIFY (b == 25000); | 
|  | b = a; b.operator*=(si);   VERIFY (b == -2000); | 
|  | b = a; b.operator*=(ui);   VERIFY (b == 5000); | 
|  | b = a; b.operator*=(sl);   VERIFY (b == -10000); | 
|  | b = a; b.operator*=(ul);   VERIFY (b == 20000); | 
|  | b = a; b.operator*=(sll);  VERIFY (b == -25000); | 
|  | b = a; b.operator*=(ull);  VERIFY (b == 50000); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_divide_64 (void) | 
|  | { | 
|  | decimal64 a (1000), b; | 
|  |  | 
|  | b = a; b.operator/=(d32);  VERIFY (b == 200); | 
|  | b = a; b.operator/=(d64);  VERIFY (b == -100); | 
|  | b = a; b.operator/=(d128); VERIFY (b == 40); | 
|  | b = a; b.operator/=(si);   VERIFY (b == -500); | 
|  | b = a; b.operator/=(ui);   VERIFY (b == 200); | 
|  | b = a; b.operator/=(sl);   VERIFY (b == -100); | 
|  | b = a; b.operator/=(ul);   VERIFY (b == 50); | 
|  | b = a; b.operator/=(sll);  VERIFY (b == -40); | 
|  | b = a; b.operator/=(ull);  VERIFY (b == 20); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_add_128 (void) | 
|  | { | 
|  | decimal128 a (1000), b; | 
|  |  | 
|  | b = a; b.operator+=(d32);  VERIFY (b == 1005); | 
|  | b = a; b.operator+=(d64);  VERIFY (b == 990); | 
|  | b = a; b.operator+=(d128); VERIFY (b == 1025); | 
|  | b = a; b.operator+=(si);   VERIFY (b == 998); | 
|  | b = a; b.operator+=(ui);   VERIFY (b == 1005); | 
|  | b = a; b.operator+=(sl);   VERIFY (b == 990); | 
|  | b = a; b.operator+=(ul);   VERIFY (b == 1020); | 
|  | b = a; b.operator+=(sll);  VERIFY (b == 975); | 
|  | b = a; b.operator+=(ull);  VERIFY (b == 1050); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_subtract_128 (void) | 
|  | { | 
|  | decimal128 a (1000), b; | 
|  |  | 
|  | b = a; b.operator-=(d32);  VERIFY (b == 995); | 
|  | b = a; b.operator-=(d64);  VERIFY (b == 1010); | 
|  | b = a; b.operator-=(d128); VERIFY (b == 975); | 
|  | b = a; b.operator-=(si);   VERIFY (b == 1002); | 
|  | b = a; b.operator-=(ui);   VERIFY (b == 995); | 
|  | b = a; b.operator-=(sl);   VERIFY (b == 1010); | 
|  | b = a; b.operator-=(ul);   VERIFY (b == 980); | 
|  | b = a; b.operator-=(sll);  VERIFY (b == 1025); | 
|  | b = a; b.operator-=(ull);  VERIFY (b == 950); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_multiply_128 (void) | 
|  | { | 
|  | decimal128 a (1000), b; | 
|  |  | 
|  | b = a; b.operator*=(d32);  VERIFY (b == 5000); | 
|  | b = a; b.operator*=(d64);  VERIFY (b == -10000); | 
|  | b = a; b.operator*=(d128); VERIFY (b == 25000); | 
|  | b = a; b.operator*=(si);   VERIFY (b == -2000); | 
|  | b = a; b.operator*=(ui);   VERIFY (b == 5000); | 
|  | b = a; b.operator*=(sl);   VERIFY (b == -10000); | 
|  | b = a; b.operator*=(ul);   VERIFY (b == 20000); | 
|  | b = a; b.operator*=(sll);  VERIFY (b == -25000); | 
|  | b = a; b.operator*=(ull);  VERIFY (b == 50000); | 
|  | } | 
|  |  | 
|  | void | 
|  | compound_assignment_divide_128 (void) | 
|  | { | 
|  | decimal128 a (1000), b; | 
|  |  | 
|  | b = a; b.operator/=(d32);  VERIFY (b == 200); | 
|  | b = a; b.operator/=(d64);  VERIFY (b == -100); | 
|  | b = a; b.operator/=(d128); VERIFY (b == 40); | 
|  | b = a; b.operator/=(si);   VERIFY (b == -500); | 
|  | b = a; b.operator/=(ui);   VERIFY (b == 200); | 
|  | b = a; b.operator/=(sl);   VERIFY (b == -100); | 
|  | b = a; b.operator/=(ul);   VERIFY (b == 50); | 
|  | b = a; b.operator/=(sll);  VERIFY (b == -40); | 
|  | b = a; b.operator/=(ull);  VERIFY (b == 20); | 
|  | } | 
|  |  | 
|  | int | 
|  | main () | 
|  | { | 
|  | compound_assignment_add_32 (); | 
|  | compound_assignment_subtract_32 (); | 
|  | compound_assignment_multiply_32 (); | 
|  | compound_assignment_divide_32 (); | 
|  |  | 
|  | compound_assignment_add_64 (); | 
|  | compound_assignment_subtract_64 (); | 
|  | compound_assignment_multiply_64 (); | 
|  | compound_assignment_divide_64 (); | 
|  |  | 
|  | compound_assignment_add_128 (); | 
|  | compound_assignment_subtract_128 (); | 
|  | compound_assignment_multiply_128 (); | 
|  | compound_assignment_divide_128 (); | 
|  | } |