xref: /llvm-project/libcxx/test/std/utilities/ratio/ratio.arithmetic/R1_R2_requirement.verify.cpp (revision fe0d277f31d3369de1fd92ad8dd8044f5b1d4ed7)
1*fe0d277fSMark de Wever //===----------------------------------------------------------------------===//
2*fe0d277fSMark de Wever //
3*fe0d277fSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*fe0d277fSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
5*fe0d277fSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*fe0d277fSMark de Wever //
7*fe0d277fSMark de Wever //===----------------------------------------------------------------------===//
8*fe0d277fSMark de Wever 
9*fe0d277fSMark de Wever // <ratio>
10*fe0d277fSMark de Wever //
11*fe0d277fSMark de Wever // [ratio.general]/2
12*fe0d277fSMark de Wever //   Throughout subclause [ratio], the names of template parameters are
13*fe0d277fSMark de Wever //   used to express type requirements. If a template parameter is named
14*fe0d277fSMark de Wever //   R1 or R2, and the template argument is not a specialization of the
15*fe0d277fSMark de Wever //   ratio template, the program is ill-formed.
16*fe0d277fSMark de Wever 
17*fe0d277fSMark de Wever #include <ratio>
18*fe0d277fSMark de Wever 
19*fe0d277fSMark de Wever struct invalid {
20*fe0d277fSMark de Wever   static const int num = 1;
21*fe0d277fSMark de Wever   static const int den = 1;
22*fe0d277fSMark de Wever };
23*fe0d277fSMark de Wever 
24*fe0d277fSMark de Wever using valid = std::ratio<1, 1>;
25*fe0d277fSMark de Wever 
26*fe0d277fSMark de Wever namespace add {
27*fe0d277fSMark de Wever using valid_valid = std::ratio_add<valid, valid>::type;
28*fe0d277fSMark de Wever using invalid_valid =
29*fe0d277fSMark de Wever     std::ratio_add<invalid, valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
30*fe0d277fSMark de Wever using valid_invalid =
31*fe0d277fSMark de Wever     std::ratio_add<valid, invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
32*fe0d277fSMark de Wever } // namespace add
33*fe0d277fSMark de Wever 
34*fe0d277fSMark de Wever namespace subtract {
35*fe0d277fSMark de Wever using valid_valid = std::ratio_subtract<valid, valid>::type;
36*fe0d277fSMark de Wever using invalid_valid =
37*fe0d277fSMark de Wever     std::ratio_subtract<invalid, valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
38*fe0d277fSMark de Wever using valid_invalid =
39*fe0d277fSMark de Wever     std::ratio_subtract<valid, invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
40*fe0d277fSMark de Wever } // namespace subtract
41*fe0d277fSMark de Wever 
42*fe0d277fSMark de Wever namespace multiply {
43*fe0d277fSMark de Wever using valid_valid = std::ratio_multiply<valid, valid>::type;
44*fe0d277fSMark de Wever using invalid_valid =
45*fe0d277fSMark de Wever     std::ratio_multiply<invalid, valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
46*fe0d277fSMark de Wever using valid_invalid =
47*fe0d277fSMark de Wever     std::ratio_multiply<valid, invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
48*fe0d277fSMark de Wever } // namespace multiply
49*fe0d277fSMark de Wever 
50*fe0d277fSMark de Wever namespace divide {
51*fe0d277fSMark de Wever using valid_valid = std::ratio_divide<valid, valid>::type;
52*fe0d277fSMark de Wever using invalid_valid =
53*fe0d277fSMark de Wever     std::ratio_divide<invalid, valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
54*fe0d277fSMark de Wever using valid_invalid =
55*fe0d277fSMark de Wever     std::ratio_divide<valid, invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
56*fe0d277fSMark de Wever } // namespace divide
57