@@ -917,31 +917,6 @@ TEST_F(MDNodeTest, deleteTemporaryWithTrackingRef) {
917917
918918typedef MetadataTest DILocationTest;
919919
920- TEST_F (DILocationTest, Overflow) {
921- DISubprogram *N = getSubprogram ();
922- {
923- DILocation *L = DILocation::get (Context, 2 , 7 , N);
924- EXPECT_EQ (2u , L->getLine ());
925- EXPECT_EQ (7u , L->getColumn ());
926- }
927- unsigned U16 = 1u << 16 ;
928- {
929- DILocation *L = DILocation::get (Context, UINT32_MAX, U16 - 1 , N);
930- EXPECT_EQ (UINT32_MAX, L->getLine ());
931- EXPECT_EQ (U16 - 1 , L->getColumn ());
932- }
933- {
934- DILocation *L = DILocation::get (Context, UINT32_MAX, U16, N);
935- EXPECT_EQ (UINT32_MAX, L->getLine ());
936- EXPECT_EQ (0u , L->getColumn ());
937- }
938- {
939- DILocation *L = DILocation::get (Context, UINT32_MAX, U16 + 1 , N);
940- EXPECT_EQ (UINT32_MAX, L->getLine ());
941- EXPECT_EQ (0u , L->getColumn ());
942- }
943- }
944-
945920TEST_F (DILocationTest, Merge) {
946921 DISubprogram *N = getSubprogram ();
947922 DIScope *S = DILexicalBlock::get (Context, N, getFile (), 3 , 4 );
@@ -961,11 +936,24 @@ TEST_F(DILocationTest, Merge) {
961936 auto *A = DILocation::get (Context, 2 , 7 , N);
962937 auto *B = DILocation::get (Context, 2 , 7 , S);
963938 auto *M = DILocation::getMergedLocation (A, B);
964- EXPECT_EQ (0u , M->getLine ()); // FIXME: Should this be 2?
965- EXPECT_EQ (0u , M->getColumn ()); // FIXME: Should this be 7?
939+ EXPECT_EQ (2u , M->getLine ());
940+ EXPECT_EQ (7u , M->getColumn ());
966941 EXPECT_EQ (N, M->getScope ());
967942 }
968943
944+ {
945+ // Same line, different column.
946+ auto *A = DILocation::get (Context, 2 , 7 , N);
947+ auto *B = DILocation::get (Context, 2 , 10 , S);
948+ auto *M0 = DILocation::getMergedLocation (A, B);
949+ auto *M1 = DILocation::getMergedLocation (B, A);
950+ for (auto *M : {M0, M1}) {
951+ EXPECT_EQ (2u , M->getLine ());
952+ EXPECT_EQ (0u , M->getColumn ());
953+ EXPECT_EQ (N, M->getScope ());
954+ }
955+ }
956+
969957 {
970958 // Different lines, same scopes.
971959 auto *A = DILocation::get (Context, 1 , 6 , N);
@@ -998,15 +986,36 @@ TEST_F(DILocationTest, Merge) {
998986
999987 auto *I = DILocation::get (Context, 2 , 7 , N);
1000988 auto *A = DILocation::get (Context, 1 , 6 , SP1, I);
1001- auto *B = DILocation::get (Context, 2 , 7 , SP2, I);
989+ auto *B = DILocation::get (Context, 3 , 8 , SP2, I);
1002990 auto *M = DILocation::getMergedLocation (A, B);
1003- EXPECT_EQ (0u , M->getLine ());
991+ EXPECT_EQ (2u , M->getLine ());
992+ EXPECT_EQ (7u , M->getColumn ());
993+ EXPECT_EQ (N, M->getScope ());
994+ EXPECT_EQ (nullptr , M->getInlinedAt ());
995+ }
996+
997+ {
998+ // Different function, inlined-at same line, but different column.
999+ auto *F = getFile ();
1000+ auto *SP1 = DISubprogram::getDistinct (Context, F, " a" , " a" , F, 0 , nullptr ,
1001+ 0 , nullptr , 0 , 0 , DINode::FlagZero,
1002+ DISubprogram::SPFlagZero, nullptr );
1003+ auto *SP2 = DISubprogram::getDistinct (Context, F, " b" , " b" , F, 0 , nullptr ,
1004+ 0 , nullptr , 0 , 0 , DINode::FlagZero,
1005+ DISubprogram::SPFlagZero, nullptr );
1006+
1007+ auto *IA = DILocation::get (Context, 2 , 7 , N);
1008+ auto *IB = DILocation::get (Context, 2 , 8 , N);
1009+ auto *A = DILocation::get (Context, 1 , 6 , SP1, IA);
1010+ auto *B = DILocation::get (Context, 3 , 8 , SP2, IB);
1011+ auto *M = DILocation::getMergedLocation (A, B);
1012+ EXPECT_EQ (2u , M->getLine ());
10041013 EXPECT_EQ (0u , M->getColumn ());
1005- EXPECT_TRUE (isa<DILocalScope>( M->getScope () ));
1006- EXPECT_EQ (I , M->getInlinedAt ());
1014+ EXPECT_EQ (N, M->getScope ());
1015+ EXPECT_EQ (nullptr , M->getInlinedAt ());
10071016 }
10081017
1009- {
1018+ {
10101019 // Completely different.
10111020 auto *I = DILocation::get (Context, 2 , 7 , N);
10121021 auto *A = DILocation::get (Context, 1 , 6 , S, I);
@@ -1018,6 +1027,67 @@ TEST_F(DILocationTest, Merge) {
10181027 EXPECT_EQ (S, M->getScope ());
10191028 EXPECT_EQ (nullptr , M->getInlinedAt ());
10201029 }
1030+
1031+ // Two locations, same line/column different file, inlined at the same place.
1032+ {
1033+ auto *FA = getFile ();
1034+ auto *FB = getFile ();
1035+ auto *FI = getFile ();
1036+
1037+ auto *SPA = DISubprogram::getDistinct (Context, FA, " a" , " a" , FA, 0 , nullptr ,
1038+ 0 , nullptr , 0 , 0 , DINode::FlagZero,
1039+ DISubprogram::SPFlagZero, nullptr );
1040+
1041+ auto *SPB = DISubprogram::getDistinct (Context, FB, " b" , " b" , FB, 0 , nullptr ,
1042+ 0 , nullptr , 0 , 0 , DINode::FlagZero,
1043+ DISubprogram::SPFlagZero, nullptr );
1044+
1045+ auto *SPI = DISubprogram::getDistinct (Context, FI, " i" , " i" , FI, 0 , nullptr ,
1046+ 0 , nullptr , 0 , 0 , DINode::FlagZero,
1047+ DISubprogram::SPFlagZero, nullptr );
1048+
1049+ auto *I = DILocation::get (Context, 3 , 8 , SPI);
1050+ auto *A = DILocation::get (Context, 2 , 7 , SPA, I);
1051+ auto *B = DILocation::get (Context, 2 , 7 , SPB, I);
1052+ auto *M = DILocation::getMergedLocation (A, B);
1053+ EXPECT_EQ (3u , M->getLine ());
1054+ EXPECT_EQ (8u , M->getColumn ());
1055+ EXPECT_TRUE (isa<DILocalScope>(M->getScope ()));
1056+ EXPECT_EQ (SPI, M->getScope ());
1057+ EXPECT_EQ (nullptr , M->getInlinedAt ());
1058+ }
1059+
1060+ // Two locations, same line/column different file, one location with 2 scopes,
1061+ // inlined at the same place.
1062+ {
1063+ auto *FA = getFile ();
1064+ auto *FB = getFile ();
1065+ auto *FI = getFile ();
1066+
1067+ auto *SPA = DISubprogram::getDistinct (Context, FA, " a" , " a" , FA, 0 , nullptr ,
1068+ 0 , nullptr , 0 , 0 , DINode::FlagZero,
1069+ DISubprogram::SPFlagZero, nullptr );
1070+
1071+ auto *SPB = DISubprogram::getDistinct (Context, FB, " b" , " b" , FB, 0 , nullptr ,
1072+ 0 , nullptr , 0 , 0 , DINode::FlagZero,
1073+ DISubprogram::SPFlagZero, nullptr );
1074+
1075+ auto *SPI = DISubprogram::getDistinct (Context, FI, " i" , " i" , FI, 0 , nullptr ,
1076+ 0 , nullptr , 0 , 0 , DINode::FlagZero,
1077+ DISubprogram::SPFlagZero, nullptr );
1078+
1079+ auto *SPAScope = DILexicalBlock::getDistinct (Context, SPA, FA, 4 , 9 );
1080+
1081+ auto *I = DILocation::get (Context, 3 , 8 , SPI);
1082+ auto *A = DILocation::get (Context, 2 , 7 , SPAScope, I);
1083+ auto *B = DILocation::get (Context, 2 , 7 , SPB, I);
1084+ auto *M = DILocation::getMergedLocation (A, B);
1085+ EXPECT_EQ (3u , M->getLine ());
1086+ EXPECT_EQ (8u , M->getColumn ());
1087+ EXPECT_TRUE (isa<DILocalScope>(M->getScope ()));
1088+ EXPECT_EQ (SPI, M->getScope ());
1089+ EXPECT_EQ (nullptr , M->getInlinedAt ());
1090+ }
10211091}
10221092
10231093TEST_F (DILocationTest, getDistinct) {
0 commit comments