// This file tests SWIG's tracking of C++ typedef declarations

%module cpp_typedef

%{

class Bar {
public:
};
%}

%inline %{
class Foo {
public:
    typedef Bar SomeBar;
    typedef SomeBar SomeOtherBar;
    SomeOtherBar bar() {
        SomeOtherBar b;
        return b;
    }
    static SomeOtherBar sbar() {
        SomeOtherBar b;
        return b;
    }
};

// Test that the correct types are used for typedef struct declarations
typedef struct {
} UnnamedStruct;

typedef struct NamedStruct {
} TypedefNamedStruct;

typedef TypedefNamedStruct DoubleTypedef;

class Test {
public:
    UnnamedStruct test1(UnnamedStruct a) {return a;};
    struct NamedStruct test2(struct NamedStruct a) {return a;};
    TypedefNamedStruct test3(TypedefNamedStruct a) {return a;};
    DoubleTypedef test4(DoubleTypedef a) {return a;};
};

%}
        

