// { dg-do run } // Copyright (C) 2000 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 30 Nov 2001 // PR 87 int assign = 0; int ctor = 0; int assignC = 0; struct A { int i; template void operator=(const T&) const { assign = 1; } A () : i (0) {} template A (const T &) { ctor = 1; } }; struct B : A { }; struct C { int i; C (int i_) :i (i_) {} template void operator= (const C &) { assignC = 1; } }; int main() { const A a; A b; B c; b = a; if (assign) return 5; b.i = 100; c.i = 200; a = b; if (!assign) return 1; if (a.i) return 2; A e (b); if (ctor) return 3; A d (c); if (!ctor) return 4; C c0 (0); C c1 (1); c0 = c1; if (assignC) return 5; return 0; }