@@ -917,31 +917,6 @@ TEST_F(MDNodeTest, deleteTemporaryWithTrackingRef) {
917
917
918
918
typedef MetadataTest DILocationTest;
919
919
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
-
945
920
TEST_F (DILocationTest, Merge) {
946
921
DISubprogram *N = getSubprogram ();
947
922
DIScope *S = DILexicalBlock::get (Context, N, getFile (), 3 , 4 );
@@ -961,11 +936,24 @@ TEST_F(DILocationTest, Merge) {
961
936
auto *A = DILocation::get (Context, 2 , 7 , N);
962
937
auto *B = DILocation::get (Context, 2 , 7 , S);
963
938
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 ());
966
941
EXPECT_EQ (N, M->getScope ());
967
942
}
968
943
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
+
969
957
{
970
958
// Different lines, same scopes.
971
959
auto *A = DILocation::get (Context, 1 , 6 , N);
@@ -998,15 +986,36 @@ TEST_F(DILocationTest, Merge) {
998
986
999
987
auto *I = DILocation::get (Context, 2 , 7 , N);
1000
988
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);
1002
990
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 ());
1004
1013
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 ());
1007
1016
}
1008
1017
1009
- {
1018
+ {
1010
1019
// Completely different.
1011
1020
auto *I = DILocation::get (Context, 2 , 7 , N);
1012
1021
auto *A = DILocation::get (Context, 1 , 6 , S, I);
@@ -1018,6 +1027,67 @@ TEST_F(DILocationTest, Merge) {
1018
1027
EXPECT_EQ (S, M->getScope ());
1019
1028
EXPECT_EQ (nullptr , M->getInlinedAt ());
1020
1029
}
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
+ }
1021
1091
}
1022
1092
1023
1093
TEST_F (DILocationTest, getDistinct) {
0 commit comments