@@ -2083,3 +2083,61 @@ size_t test33(struct annotated *ptr) {
20832083 // Don't handle '&ptr->array' like normal.
20842084 return __bdos (& * & * & * & ptr -> array );
20852085}
2086+
2087+ struct multi_subscripts {
2088+ unsigned long flags [42 ][42 ];
2089+ int count ;
2090+ int array [] __counted_by (count );
2091+ };
2092+
2093+ // SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test34(
2094+ // SANITIZE-WITH-ATTR-SAME: ptr noundef [[PTR:%.*]], i32 noundef [[IDX1:%.*]], i32 noundef [[IDX2:%.*]]) local_unnamed_addr #[[ATTR0]] {
2095+ // SANITIZE-WITH-ATTR-NEXT: entry:
2096+ // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp ult i32 [[IDX1]], 42
2097+ // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP0]], label [[CONT1:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
2098+ // SANITIZE-WITH-ATTR: handler.out_of_bounds:
2099+ // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[IDX1]] to i64, !nosanitize [[META2]]
2100+ // SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB51:[0-9]+]], i64 [[TMP1]]) #[[ATTR7]], !nosanitize [[META2]]
2101+ // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]]
2102+ // SANITIZE-WITH-ATTR: cont1:
2103+ // SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = icmp ult i32 [[IDX2]], 43
2104+ // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP2]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS2:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
2105+ // SANITIZE-WITH-ATTR: handler.out_of_bounds2:
2106+ // SANITIZE-WITH-ATTR-NEXT: [[TMP3:%.*]] = zext i32 [[IDX2]] to i64
2107+ // SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB52:[0-9]+]], i64 [[TMP3]]) #[[ATTR7]], !nosanitize [[META2]]
2108+ // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]]
2109+ // SANITIZE-WITH-ATTR: cont3:
2110+ // SANITIZE-WITH-ATTR-NEXT: ret i64 -1
2111+ //
2112+ // NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test34(
2113+ // NO-SANITIZE-WITH-ATTR-SAME: ptr noundef readnone [[PTR:%.*]], i32 noundef [[IDX1:%.*]], i32 noundef [[IDX2:%.*]]) local_unnamed_addr #[[ATTR3]] {
2114+ // NO-SANITIZE-WITH-ATTR-NEXT: entry:
2115+ // NO-SANITIZE-WITH-ATTR-NEXT: ret i64 -1
2116+ //
2117+ // SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i64 @test34(
2118+ // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[PTR:%.*]], i32 noundef [[IDX1:%.*]], i32 noundef [[IDX2:%.*]]) local_unnamed_addr #[[ATTR0]] {
2119+ // SANITIZE-WITHOUT-ATTR-NEXT: entry:
2120+ // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = icmp ult i32 [[IDX1]], 42
2121+ // SANITIZE-WITHOUT-ATTR-NEXT: br i1 [[TMP0]], label [[CONT1:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF8]], !nosanitize [[META9]]
2122+ // SANITIZE-WITHOUT-ATTR: handler.out_of_bounds:
2123+ // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[IDX1]] to i64, !nosanitize [[META9]]
2124+ // SANITIZE-WITHOUT-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB20:[0-9]+]], i64 [[TMP1]]) #[[ATTR7]], !nosanitize [[META9]]
2125+ // SANITIZE-WITHOUT-ATTR-NEXT: unreachable, !nosanitize [[META9]]
2126+ // SANITIZE-WITHOUT-ATTR: cont1:
2127+ // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP2:%.*]] = icmp ult i32 [[IDX2]], 43
2128+ // SANITIZE-WITHOUT-ATTR-NEXT: br i1 [[TMP2]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS2:%.*]], !prof [[PROF8]], !nosanitize [[META9]]
2129+ // SANITIZE-WITHOUT-ATTR: handler.out_of_bounds2:
2130+ // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP3:%.*]] = zext i32 [[IDX2]] to i64
2131+ // SANITIZE-WITHOUT-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB21:[0-9]+]], i64 [[TMP3]]) #[[ATTR7]], !nosanitize [[META9]]
2132+ // SANITIZE-WITHOUT-ATTR-NEXT: unreachable, !nosanitize [[META9]]
2133+ // SANITIZE-WITHOUT-ATTR: cont3:
2134+ // SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -1
2135+ //
2136+ // NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i64 @test34(
2137+ // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr noundef readnone [[PTR:%.*]], i32 noundef [[IDX1:%.*]], i32 noundef [[IDX2:%.*]]) local_unnamed_addr #[[ATTR1]] {
2138+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
2139+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -1
2140+ //
2141+ size_t test34 (struct multi_subscripts * ptr , int idx1 , int idx2 ) {
2142+ return __bdos (& ptr -> flags [idx1 ][idx2 ]);
2143+ }
0 commit comments