1// { dg-do run  }
2// Copyright (C) 1999 Free Software Foundation, Inc.
3// Contributed by Nathan Sidwell 6 Jun 1999 <nathan@acm.org>
4
5// dynamic cast can only cast to public unambiguous bases
6
7extern "C" void abort ();
8
9struct A {virtual ~A(){} int m; };
10struct B {virtual ~B(){} int m; };
11
12struct C1 : A {int m;};
13struct C2 : A {int m;};
14
15// A is ambiguous, but private in one branch
16struct D1 : B, C1, private C2 {int m;};
17// A is ambiguous, and public in both branches
18struct D2 : B, C1, C2 {int m;};
19
20void fn(B *bd1, B *bd2)
21{
22  A *ad1;
23  A *ad2;
24
25  ad1 = dynamic_cast<A *>(bd1);
26  if(ad1) abort();
27  ad2 = dynamic_cast<A *>(bd2);
28  if(ad2) abort();
29}
30
31int main()
32{
33  D1 d1;
34  D2 d2;
35
36  fn((B *)&d1, (B *)&d2);
37  return 0;
38}
39