xref: /llvm-project/libcxx/test/std/utilities/ratio/ratio.comparison/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 // Since all std::ratio_xxx_v variables use the same instantiation, only one
18*fe0d277fSMark de Wever // error will be generated. These values are tested in a separate test.
19*fe0d277fSMark de Wever 
20*fe0d277fSMark de Wever #include <ratio>
21*fe0d277fSMark de Wever 
22*fe0d277fSMark de Wever struct invalid {
23*fe0d277fSMark de Wever   static const int num = 1;
24*fe0d277fSMark de Wever   static const int den = 1;
25*fe0d277fSMark de Wever };
26*fe0d277fSMark de Wever 
27*fe0d277fSMark de Wever using valid = std::ratio<1, 1>;
28*fe0d277fSMark de Wever 
29*fe0d277fSMark de Wever namespace equal {
30*fe0d277fSMark de Wever using valid_valid = std::ratio_equal<valid, valid>::type;
31*fe0d277fSMark de Wever using invalid_valid =
32*fe0d277fSMark de Wever     std::ratio_equal<invalid, valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
33*fe0d277fSMark de Wever using valid_invalid =
34*fe0d277fSMark de Wever     std::ratio_equal<valid, invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
35*fe0d277fSMark de Wever } // namespace equal
36*fe0d277fSMark de Wever 
37*fe0d277fSMark de Wever namespace not_equal {
38*fe0d277fSMark de Wever using valid_valid = std::ratio_not_equal<valid, valid>::type;
39*fe0d277fSMark de Wever using invalid_valid =
40*fe0d277fSMark de Wever     std::ratio_not_equal<invalid,
41*fe0d277fSMark de Wever                          valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
42*fe0d277fSMark de Wever using valid_invalid =
43*fe0d277fSMark de Wever     std::ratio_not_equal<valid,
44*fe0d277fSMark de Wever                          invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
45*fe0d277fSMark de Wever } // namespace not_equal
46*fe0d277fSMark de Wever 
47*fe0d277fSMark de Wever namespace less {
48*fe0d277fSMark de Wever using valid_valid = std::ratio_less<valid, valid>::type;
49*fe0d277fSMark de Wever using invalid_valid =
50*fe0d277fSMark de Wever     std::ratio_less<invalid, valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
51*fe0d277fSMark de Wever using valid_invalid =
52*fe0d277fSMark de Wever     std::ratio_less<valid, invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
53*fe0d277fSMark de Wever } // namespace less
54*fe0d277fSMark de Wever 
55*fe0d277fSMark de Wever namespace less_equal {
56*fe0d277fSMark de Wever using valid_valid = std::ratio_less_equal<valid, valid>::type;
57*fe0d277fSMark de Wever using invalid_valid =
58*fe0d277fSMark de Wever     std::ratio_less_equal<invalid,
59*fe0d277fSMark de Wever                           valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
60*fe0d277fSMark de Wever using valid_invalid =
61*fe0d277fSMark de Wever     std::ratio_less_equal<valid,
62*fe0d277fSMark de Wever                           invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
63*fe0d277fSMark de Wever } // namespace less_equal
64*fe0d277fSMark de Wever 
65*fe0d277fSMark de Wever namespace greater {
66*fe0d277fSMark de Wever using valid_valid = std::ratio_greater<valid, valid>::type;
67*fe0d277fSMark de Wever using invalid_valid =
68*fe0d277fSMark de Wever     std::ratio_greater<invalid, valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
69*fe0d277fSMark de Wever using valid_invalid =
70*fe0d277fSMark de Wever     std::ratio_greater<valid, invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
71*fe0d277fSMark de Wever } // namespace greater
72*fe0d277fSMark de Wever 
73*fe0d277fSMark de Wever namespace greater_equal {
74*fe0d277fSMark de Wever using valid_valid = std::ratio_greater_equal<valid, valid>::type;
75*fe0d277fSMark de Wever using invalid_valid =
76*fe0d277fSMark de Wever     std::ratio_greater_equal<invalid,
77*fe0d277fSMark de Wever                              valid>::type; // expected-error@*:* {{R1 to be a specialisation of the ratio template}}
78*fe0d277fSMark de Wever using valid_invalid =
79*fe0d277fSMark de Wever     std::ratio_greater_equal<valid,
80*fe0d277fSMark de Wever                              invalid>::type; // expected-error@*:* {{R2 to be a specialisation of the ratio template}}
81*fe0d277fSMark de Wever } // namespace greater_equal
82