1// Copyright (C) 2009-2015 Free Software Foundation, Inc.
2//
3// This file is part of the GNU ISO C++ Library.  This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 3, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING3.  If not see
16// <http://www.gnu.org/licenses/>.
17
18// { dg-do compile }
19// { dg-require-effective-target dfp }
20
21// Test that binary arithmetic operators do not accept mixed decimal
22// and generic floating-point operands.  This isn't explicity
23// prohibited in ISO/IEC TR 24733 but it is prohibited in C, and in C++
24// there should not be an implicit conversion from a decimal
25// floating-point type to a generic floating-point type.
26
27#include <decimal/decimal>
28
29using namespace std::decimal;
30
31decimal32 a32, b32, c32;
32decimal64 a64, b64, c64;
33decimal128 a128, b128, c128;
34float f;
35double d;
36long double ld;
37bool b1, b2, b3, b4, b5, b6;
38
39void
40bad_add (void)
41{
42  a32 = b32 + f;	// { dg-error "error" }
43  a32 = ld + b32;	// { dg-error "error" }
44  a64 = b64 + d;	// { dg-error "error" }
45  a64 = ld + b64;	// { dg-error "error" }
46  a128 = b128 + ld;	// { dg-error "error" }
47  a128 = d + b128;	// { dg-error "error" }
48}
49
50void
51bad_subtract (void)
52{
53  a32 = b32 - f;	// { dg-error "error" }
54  a32 = ld - b32;	// { dg-error "error" }
55  a64 = b64 - d;	// { dg-error "error" }
56  a64 = ld - b64;	// { dg-error "error" }
57  a128 = b128 - ld;	// { dg-error "error" }
58  a128 = d - b128;	// { dg-error "error" }
59}
60
61void
62bad_multiply (void)
63{
64  a32 = b32 * f;	// { dg-error "error" }
65  a32 = ld * b32;	// { dg-error "error" }
66  a64 = b64 * d;	// { dg-error "error" }
67  a64 = ld * b64;	// { dg-error "error" }
68  a128 = b128 * ld;	// { dg-error "error" }
69  a128 = d * b128;	// { dg-error "error" }
70}
71
72void
73bad_divide (void)
74{
75  a32 = b32 / f;	// { dg-error "error" }
76  a32 = ld / b32;	// { dg-error "error" }
77  a64 = b64 / d;	// { dg-error "error" }
78  a64 = ld / b64;	// { dg-error "error" }
79  a128 = b128 / ld;	// { dg-error "error" }
80  a128 = d / b128;	// { dg-error "error" }
81}
82
83void
84bad_pluseq (void)
85{
86  a32 += f;		// { dg-error "error" }
87  a32 += d;		// { dg-error "error" }
88  a32 += ld;		// { dg-error "error" }
89  a64 += f;		// { dg-error "error" }
90  a64 += d;		// { dg-error "error" }
91  a64 += ld;		// { dg-error "error" }
92  a128 += f;		// { dg-error "error" }
93  a128 += d;		// { dg-error "error" }
94  a128 += ld;		// { dg-error "error" }
95}
96
97void
98bad_minuseq (void)
99{
100  a32 -= f;		// { dg-error "error" }
101  a32 -= d;		// { dg-error "error" }
102  a32 -= ld;		// { dg-error "error" }
103  a64 -= f;		// { dg-error "error" }
104  a64 -= d;		// { dg-error "error" }
105  a64 -= ld;		// { dg-error "error" }
106  a128 -= f;		// { dg-error "error" }
107  a128 -= d;		// { dg-error "error" }
108  a128 -= ld;		// { dg-error "error" }
109}
110
111void
112bad_timeseq (void)
113{
114  a32 *= f;		// { dg-error "error" }
115  a32 *= d;		// { dg-error "error" }
116  a32 *= ld;		// { dg-error "error" }
117  a64 *= f;		// { dg-error "error" }
118  a64 *= d;		// { dg-error "error" }
119  a64 *= ld;		// { dg-error "error" }
120  a128 *= f;		// { dg-error "error" }
121  a128 *= d;		// { dg-error "error" }
122  a128 *= ld;		// { dg-error "error" }
123}
124
125void
126bad_divideeq (void)
127{
128  a32 /= f;		// { dg-error "error" }
129  a32 /= d;		// { dg-error "error" }
130  a32 /= ld;		// { dg-error "error" }
131  a64 /= f;		// { dg-error "error" }
132  a64 /= d;		// { dg-error "error" }
133  a64 /= ld;		// { dg-error "error" }
134  a128 /= f;		// { dg-error "error" }
135  a128 /= d;		// { dg-error "error" }
136  a128 /= ld;		// { dg-error "error" }
137}
138
139