Skip to content

Commit 1de09dd

Browse files
committed
Add tests for APFloat::getPromoted
1 parent a0029be commit 1de09dd

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed

llvm/unittests/ADT/APFloatTest.cpp

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)