@@ -2402,11 +2402,11 @@ template<typename T> struct DerivedB : BaseA<T> { };
2402
2402
template <typename T> struct CrazyDerived : T { };
2403
2403
2404
2404
2405
- class class_forward ; // expected-note 2 {{forward declaration of 'class_forward'}}
2405
+ class class_forward ; // expected-note 4 {{forward declaration of 'class_forward'}}
2406
2406
2407
2407
template <class T > class DerivedTemp : Base {};
2408
2408
template <class T > class NonderivedTemp {};
2409
- template <class T > class UndefinedTemp ; // expected-note {{declared here}}
2409
+ template <class T > class UndefinedTemp ; // expected-note 2 {{declared here}}
2410
2410
2411
2411
void is_base_of () {
2412
2412
static_assert (__is_base_of (Base, Derived));
@@ -2457,6 +2457,76 @@ void is_base_of() {
2457
2457
static_assert (!__is_base_of (DerivedB<int >, BaseA<int >));
2458
2458
}
2459
2459
2460
+ struct DerivedTransitiveViaNonVirtual : Derived3 {};
2461
+ struct DerivedTransitiveViaVirtual : virtual Derived3 {};
2462
+
2463
+ template <typename T>
2464
+ struct CrazyDerivedVirtual : virtual T {};
2465
+
2466
+ struct DerivedPrivate : private virtual Base {};
2467
+ struct DerivedProtected : protected virtual Base {};
2468
+ struct DerivedPrivatePrivate : private DerivedPrivate {};
2469
+ struct DerivedPrivateProtected : private DerivedProtected {};
2470
+ struct DerivedProtectedPrivate : protected DerivedProtected {};
2471
+ struct DerivedProtectedProtected : protected DerivedProtected {};
2472
+
2473
+ void is_virtual_base_of (int n) {
2474
+ static_assert (!__builtin_is_virtual_base_of (Base, Derived));
2475
+ static_assert (!__builtin_is_virtual_base_of (const Base, Derived));
2476
+ static_assert (!__builtin_is_virtual_base_of (Derived, Base));
2477
+ static_assert (!__builtin_is_virtual_base_of (Derived, int ));
2478
+ static_assert (!__builtin_is_virtual_base_of (Base, Base));
2479
+ static_assert (!__builtin_is_virtual_base_of (Base, Derived3));
2480
+ static_assert (!__builtin_is_virtual_base_of (Derived, Derived3));
2481
+ static_assert (__builtin_is_virtual_base_of (Derived2b, Derived3));
2482
+ static_assert (__builtin_is_virtual_base_of (Derived2a, Derived3));
2483
+ static_assert (!__builtin_is_virtual_base_of (BaseA<int >, DerivedB<int >));
2484
+ static_assert (!__builtin_is_virtual_base_of (DerivedB<int >, BaseA<int >));
2485
+ static_assert (!__builtin_is_virtual_base_of (Union, Union));
2486
+ static_assert (!__builtin_is_virtual_base_of (Empty, Empty));
2487
+ static_assert (!__builtin_is_virtual_base_of (class_forward, class_forward)); // expected-error {{incomplete type 'class_forward' where a complete type is required}}
2488
+ static_assert (!__builtin_is_virtual_base_of (Empty, class_forward)); // expected-error {{incomplete type 'class_forward' where a complete type is required}}
2489
+ static_assert (!__builtin_is_virtual_base_of (class_forward, Empty));
2490
+ static_assert (!__builtin_is_virtual_base_of (Base&, Derived&));
2491
+ static_assert (!__builtin_is_virtual_base_of (Base[10 ], Derived[10 ]));
2492
+ static_assert (!__builtin_is_virtual_base_of (Base[n], Derived[n])); // expected-error 2 {{variable length arrays are not supported in '__builtin_is_virtual_base_of'}}
2493
+ static_assert (!__builtin_is_virtual_base_of (int , int ));
2494
+ static_assert (!__builtin_is_virtual_base_of (int [], int []));
2495
+ static_assert (!__builtin_is_virtual_base_of (long , int ));
2496
+ static_assert (!__builtin_is_virtual_base_of (Base, DerivedTemp<int >));
2497
+ static_assert (!__builtin_is_virtual_base_of (Base, NonderivedTemp<int >));
2498
+ static_assert (!__builtin_is_virtual_base_of (Base, UndefinedTemp<int >)); // expected-error {{implicit instantiation of undefined template 'UndefinedTemp<int>'}}
2499
+ static_assert (__builtin_is_virtual_base_of (Base, DerivedPrivate));
2500
+ static_assert (__builtin_is_virtual_base_of (Base, DerivedProtected));
2501
+ static_assert (__builtin_is_virtual_base_of (Base, DerivedPrivatePrivate));
2502
+ static_assert (__builtin_is_virtual_base_of (Base, DerivedPrivateProtected));
2503
+ static_assert (__builtin_is_virtual_base_of (Base, DerivedProtectedPrivate));
2504
+ static_assert (__builtin_is_virtual_base_of (Base, DerivedProtectedProtected));
2505
+ static_assert (__builtin_is_virtual_base_of (Derived2a, DerivedTransitiveViaNonVirtual));
2506
+ static_assert (__builtin_is_virtual_base_of (Derived2b, DerivedTransitiveViaNonVirtual));
2507
+ static_assert (__builtin_is_virtual_base_of (Derived2a, DerivedTransitiveViaVirtual));
2508
+ static_assert (__builtin_is_virtual_base_of (Derived2b, DerivedTransitiveViaVirtual));
2509
+ static_assert (!__builtin_is_virtual_base_of (Base, CrazyDerived<Base>));
2510
+ static_assert (!__builtin_is_virtual_base_of (CrazyDerived<Base>, Base));
2511
+ static_assert (__builtin_is_virtual_base_of (Base, CrazyDerivedVirtual<Base>));
2512
+ static_assert (!__builtin_is_virtual_base_of (CrazyDerivedVirtual<Base>, Base));
2513
+
2514
+ static_assert (!__builtin_is_virtual_base_of (IncompleteUnion, IncompleteUnion));
2515
+ static_assert (!__builtin_is_virtual_base_of (Union, IncompleteUnion));
2516
+ static_assert (!__builtin_is_virtual_base_of (IncompleteUnion, Union));
2517
+ static_assert (!__builtin_is_virtual_base_of (IncompleteStruct, IncompleteUnion));
2518
+ static_assert (!__builtin_is_virtual_base_of (IncompleteUnion, IncompleteStruct));
2519
+ static_assert (!__builtin_is_virtual_base_of (Empty, IncompleteUnion));
2520
+ static_assert (!__builtin_is_virtual_base_of (IncompleteUnion, Empty));
2521
+ static_assert (!__builtin_is_virtual_base_of (int , IncompleteUnion));
2522
+ static_assert (!__builtin_is_virtual_base_of (IncompleteUnion, int ));
2523
+ static_assert (!__builtin_is_virtual_base_of (Empty, Union));
2524
+ static_assert (!__builtin_is_virtual_base_of (Union, Empty));
2525
+ static_assert (!__builtin_is_virtual_base_of (int , Empty));
2526
+ static_assert (!__builtin_is_virtual_base_of (Union, int ));
2527
+ static_assert (!__builtin_is_virtual_base_of (IncompleteStruct, IncompleteStruct[n])); // expected-error {{variable length arrays are not supported in '__builtin_is_virtual_base_of'}}
2528
+ }
2529
+
2460
2530
template <class T , class U >
2461
2531
class TemplateClass {};
2462
2532
0 commit comments