@@ -10182,4 +10182,113 @@ TEST(APFloatTest, FrexpQuietSNaN) {
1018210182 EXPECT_FALSE (Result.isSignaling ());
1018310183}
1018410184
10185+ TEST (APFloatTest, getPromoted) {
10186+ // Strengthening promotions are allowed.
10187+ bool LosesInfo = false ;
10188+ APFloat ValidPromotionTest (1 .0f );
10189+ APFloat FloatVal = ValidPromotionTest.getPromoted (APFloat::IEEEsingle ());
10190+ APFloat DoubleVal = ValidPromotionTest.getPromoted (APFloat::IEEEdouble ());
10191+ APFloat QuadVal = ValidPromotionTest.getPromoted (APFloat::IEEEquad ());
10192+ APFloat X87DoubleVal =
10193+ ValidPromotionTest.getPromoted (APFloat::x87DoubleExtended ());
10194+ APFloat PPCDoubleDoubleVal =
10195+ ValidPromotionTest.getPromoted (APFloat::PPCDoubleDoubleLegacy ());
10196+
10197+ // Trivial promotions to the same semantics are allowed.
10198+ FloatVal.getPromoted (FloatVal.getSemantics ());
10199+ DoubleVal.getPromoted (DoubleVal.getSemantics ());
10200+ QuadVal.getPromoted (QuadVal.getSemantics ());
10201+ X87DoubleVal.getPromoted (X87DoubleVal.getSemantics ());
10202+ PPCDoubleDoubleVal.getPromoted (PPCDoubleDoubleVal.getSemantics ());
10203+
10204+ // Promotions have the expected semantics.
10205+ EXPECT_EQ (&FloatVal.getSemantics (), &APFloat::IEEEsingle ());
10206+ EXPECT_EQ (&DoubleVal.getSemantics (), &APFloat::IEEEdouble ());
10207+ EXPECT_EQ (&QuadVal.getSemantics (), &APFloat::IEEEquad ());
10208+ EXPECT_EQ (&X87DoubleVal.getSemantics (), &APFloat::x87DoubleExtended ());
10209+ EXPECT_EQ (&PPCDoubleDoubleVal.getSemantics (),
10210+ &APFloat::PPCDoubleDoubleLegacy ());
10211+
10212+ // Promotions preserve the initial value.
10213+ QuadVal.convert (APFloat::IEEEdouble (), APFloat::rmNearestTiesToEven,
10214+ &LosesInfo);
10215+ EXPECT_FALSE (LosesInfo);
10216+ X87DoubleVal.convert (APFloat::IEEEdouble (), APFloat::rmNearestTiesToEven,
10217+ &LosesInfo);
10218+ EXPECT_FALSE (LosesInfo);
10219+ PPCDoubleDoubleVal.convert (APFloat::IEEEdouble (),
10220+ APFloat::rmNearestTiesToEven, &LosesInfo);
10221+ EXPECT_FALSE (LosesInfo);
10222+ EXPECT_EQ (1.0 , FloatVal.convertToFloat ());
10223+ EXPECT_EQ (1.0 , DoubleVal.convertToDouble ());
10224+ EXPECT_EQ (1.0 , QuadVal.convertToDouble ());
10225+ EXPECT_EQ (1.0 , X87DoubleVal.convertToDouble ());
10226+ EXPECT_EQ (1.0 , PPCDoubleDoubleVal.convertToDouble ());
10227+
10228+ // All invalid promotions are swiftly killed.
10229+ APFloat InvalidPromotionTest (1 .0f );
10230+ EXPECT_DEATH (InvalidPromotionTest.getPromoted (APFloat::IEEEhalf ()),
10231+ " Target semantics will lose information" );
10232+ EXPECT_DEATH (InvalidPromotionTest.getPromoted (APFloat::BFloat ()),
10233+ " Target semantics will lose information." );
10234+
10235+ APFloat InvalidPromotionDoubleTest =
10236+ InvalidPromotionTest.getPromoted (APFloat::IEEEdouble ());
10237+ EXPECT_DEATH (InvalidPromotionDoubleTest.getPromoted (APFloat::BFloat ()),
10238+ " Target semantics will lose information." );
10239+ EXPECT_DEATH (InvalidPromotionDoubleTest.getPromoted (APFloat::IEEEsingle ()),
10240+ " Target semantics will lose information" );
10241+ EXPECT_DEATH (InvalidPromotionDoubleTest.getPromoted (APFloat::IEEEhalf ()),
10242+ " Target semantics will lose information" );
10243+
10244+ APFloat InvalidPromotionQuadTest =
10245+ InvalidPromotionTest.getPromoted (APFloat::IEEEquad ());
10246+ EXPECT_DEATH (InvalidPromotionQuadTest.getPromoted (APFloat::BFloat ()),
10247+ " Target semantics will lose information." );
10248+ EXPECT_DEATH (InvalidPromotionQuadTest.getPromoted (APFloat::IEEEsingle ()),
10249+ " Target semantics will lose information" );
10250+ EXPECT_DEATH (InvalidPromotionQuadTest.getPromoted (APFloat::IEEEhalf ()),
10251+ " Target semantics will lose information" );
10252+ EXPECT_DEATH (InvalidPromotionQuadTest.getPromoted (APFloat::IEEEdouble ()),
10253+ " Target semantics will lose information" );
10254+ EXPECT_DEATH (
10255+ InvalidPromotionQuadTest.getPromoted (APFloat::x87DoubleExtended ()),
10256+ " Target semantics will lose information" );
10257+ EXPECT_DEATH (
10258+ InvalidPromotionQuadTest.getPromoted (APFloat::PPCDoubleDoubleLegacy ()),
10259+ " Target semantics will lose information" );
10260+
10261+ APFloat InvalidPromotionX87Test =
10262+ InvalidPromotionTest.getPromoted (APFloat::x87DoubleExtended ());
10263+ EXPECT_DEATH (InvalidPromotionX87Test.getPromoted (APFloat::BFloat ()),
10264+ " Target semantics will lose information." );
10265+ EXPECT_DEATH (InvalidPromotionX87Test.getPromoted (APFloat::IEEEsingle ()),
10266+ " Target semantics will lose information" );
10267+ EXPECT_DEATH (InvalidPromotionX87Test.getPromoted (APFloat::IEEEhalf ()),
10268+ " Target semantics will lose information" );
10269+ EXPECT_DEATH (InvalidPromotionX87Test.getPromoted (APFloat::IEEEdouble ()),
10270+ " Target semantics will lose information" );
10271+ EXPECT_DEATH (
10272+ InvalidPromotionX87Test.getPromoted (APFloat::PPCDoubleDoubleLegacy ()),
10273+ " Target semantics will lose information" );
10274+
10275+ APFloat InvalidPromotionPPCDoubleDoubleTest =
10276+ InvalidPromotionTest.getPromoted (APFloat::PPCDoubleDoubleLegacy ());
10277+ EXPECT_DEATH (
10278+ InvalidPromotionPPCDoubleDoubleTest.getPromoted (APFloat::BFloat ()),
10279+ " Target semantics will lose information." );
10280+ EXPECT_DEATH (
10281+ InvalidPromotionPPCDoubleDoubleTest.getPromoted (APFloat::IEEEsingle ()),
10282+ " Target semantics will lose information" );
10283+ EXPECT_DEATH (
10284+ InvalidPromotionPPCDoubleDoubleTest.getPromoted (APFloat::IEEEhalf ()),
10285+ " Target semantics will lose information" );
10286+ EXPECT_DEATH (
10287+ InvalidPromotionPPCDoubleDoubleTest.getPromoted (APFloat::IEEEdouble ()),
10288+ " Target semantics will lose information" );
10289+ EXPECT_DEATH (InvalidPromotionPPCDoubleDoubleTest.getPromoted (
10290+ APFloat::x87DoubleExtended ()),
10291+ " Target semantics will lose information" );
10292+ }
10293+
1018510294} // namespace
0 commit comments