@@ -52,6 +52,10 @@ struct BaseClass
52
52
struct DerivedClass : BaseClass
53
53
{
54
54
};
55
+ struct AddressOverloaded
56
+ {
57
+ AddressOverloaded operator &() const { return {}; }
58
+ };
55
59
}
56
60
57
61
GSL_SUPPRESS (con.4 ) // NO-FORMAT: attribute
@@ -306,19 +310,17 @@ TEST_CASE("from_pointer_pointer_constructor")
306
310
}
307
311
}
308
312
309
- GSL_SUPPRESS (con.4 ) // NO-FORMAT: attribute
310
- GSL_SUPPRESS(bounds.3 ) // NO-FORMAT: attribute // TODO: false positive?
311
313
TEST_CASE (" from_array_constructor" )
312
314
{
313
315
int arr[5 ] = {1 , 2 , 3 , 4 , 5 };
314
316
315
317
{
316
- span<int > s{arr};
318
+ const span<int > s{arr};
317
319
CHECK ((s.size () == 5 && s.data () == &arr[0 ]));
318
320
}
319
321
320
322
{
321
- span<int , 5 > s{arr};
323
+ const span<int , 5 > s{arr};
322
324
CHECK ((s.size () == 5 && s.data () == &arr[0 ]));
323
325
}
324
326
@@ -350,8 +352,8 @@ TEST_CASE("from_array_constructor")
350
352
}
351
353
#endif
352
354
{
353
- span<int [3 ]> s{& arr2d[0 ], 1 };
354
- CHECK ((s.size () == 1 && s.data () == & arr2d[0 ]));
355
+ const span<int [3 ]> s{std::addressof ( arr2d[0 ]) , 1 };
356
+ CHECK ((s.size () == 1 && s.data () == std::addressof ( arr2d[0 ]) ));
355
357
}
356
358
357
359
int arr3d[2 ][3 ][2 ] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 };
@@ -379,24 +381,32 @@ TEST_CASE("from_array_constructor")
379
381
}
380
382
#endif
381
383
{
382
- span<int [3 ][2 ]> s{& arr3d[0 ], 1 };
383
- CHECK ((s.size () == 1 && s.data () == & arr3d[0 ]));
384
+ const span<int [3 ][2 ]> s{std::addressof ( arr3d[0 ]) , 1 };
385
+ CHECK ((s.size () == 1 && s.data () == std::addressof ( arr3d[0 ]) ));
384
386
}
385
387
386
388
{
387
- auto s = make_span (arr);
388
- CHECK ((s.size () == 5 && s.data () == &arr[0 ]));
389
+ const auto s = make_span (arr);
390
+ CHECK ((s.size () == 5 && s.data () == std::addressof (arr[0 ])));
391
+ }
392
+
393
+ {
394
+ const auto s = make_span (std::addressof (arr2d[0 ]), 1 );
395
+ CHECK ((s.size () == 1 && s.data () == std::addressof (arr2d[0 ])));
389
396
}
390
397
391
398
{
392
- auto s = make_span (&(arr2d [0 ]), 1 );
393
- CHECK ((s.size () == 1 && s.data () == &arr2d [0 ]));
399
+ const auto s = make_span (std::addressof (arr3d [0 ]), 1 );
400
+ CHECK ((s.size () == 1 && s.data () == std::addressof (arr3d [0 ]) ));
394
401
}
395
402
403
+ AddressOverloaded ao_arr[5 ] = {};
404
+
396
405
{
397
- auto s = make_span (&arr3d[ 0 ], 1 ) ;
398
- CHECK ((s.size () == 1 && s.data () == &arr3d [0 ]));
406
+ const span<AddressOverloaded, 5 > s{ao_arr} ;
407
+ CHECK ((s.size () == 5 && s.data () == std::addressof (ao_arr [0 ]) ));
399
408
}
409
+
400
410
}
401
411
402
412
GSL_SUPPRESS (con.4 ) // NO-FORMAT: attribute
@@ -442,6 +452,13 @@ TEST_CASE("from_std_array_constructor")
442
452
CHECK ((cs.size () == narrow_cast<ptrdiff_t >(arr.size ()) && cs.data () == arr.data ()));
443
453
}
444
454
455
+ std::array<AddressOverloaded, 4 > ao_arr{};
456
+
457
+ {
458
+ span<AddressOverloaded, 4 > fs{ao_arr};
459
+ CHECK ((fs.size () == narrow_cast<ptrdiff_t >(ao_arr.size ()) && ao_arr.data () == fs.data ()));
460
+ }
461
+
445
462
#ifdef CONFIRM_COMPILATION_ERRORS
446
463
{
447
464
span<int , 2 > s{arr};
@@ -516,6 +533,13 @@ TEST_CASE("from_const_std_array_constructor")
516
533
CHECK ((s.size () == narrow_cast<ptrdiff_t >(arr.size ()) && s.data () == arr.data ()));
517
534
}
518
535
536
+ const std::array<AddressOverloaded, 4 > ao_arr{};
537
+
538
+ {
539
+ span<const AddressOverloaded, 4 > s{ao_arr};
540
+ CHECK ((s.size () == narrow_cast<ptrdiff_t >(ao_arr.size ()) && s.data () == ao_arr.data ()));
541
+ }
542
+
519
543
#ifdef CONFIRM_COMPILATION_ERRORS
520
544
{
521
545
span<const int , 2 > s{arr};
0 commit comments