// { dg-do assemble  }
// Error: Internal Compiler Error in GCC 2.7.2 and EGCS 1998/05/28 snapshot.

#include <iostream>

class some_base
        {
public:
        class base_func_args;
        virtual void func(base_func_args &) = 0; // { dg-message "note" } referenced below
        };

class some_base::base_func_args
        {
public:
        int i;
        };

class some_derived : public some_base // { dg-message "note" }
        {
public:
        class derived_func_args;
        void func(derived_func_args &);
        };


class derived_func_args : public some_base::base_func_args
        {
public:
        float f;
        };

class some_derived::func(derived_func_args &a)  // { dg-error "does not name a type" "type" } illegal member syntax
// { dg-error "expected" "exp" { target *-*-* } .-1 }
        {
        std::cout << a.i << ' ' << a.f << std::endl;
        }

int
main()
        {
	some_derived d;                     // { dg-error "abstract type" } 
        some_derived::derived_func_args dfa; // { dg-error "incomplete type" } 
        some_base *b = &d;

        dfa.i = 10;
        dfa.f = 20;
        b->func(dfs);                       // { dg-error "'dfs' was not declared" } 
        return 0;
        }
