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