%module cpp11_final_class %warnfilter(SWIGWARN_PARSE_KEYWORD) final; // 'final' is a java keyword, renaming to '_final' %warnfilter(SWIGWARN_PARSE_KEYWORD) override; // 'override' is a C# keyword, renaming to '_override' %ignore Space1::final::operator=; #if defined(SWIGPHP) %rename(Space1_final) Space1::final::final; #endif #if defined(SWIGOCAML) %rename(finale) BrokenSpace::FinalEnum1::final; #endif %inline %{ struct FinalBase { virtual ~FinalBase() {} }; struct FinalClass1 final : FinalBase { void method1() {} }; class FinalClass2 final : public FinalBase { public: void method2() {} }; struct FinalClass3 final { void method3() {} }; struct FinalClass4 { void method4() {} } final; struct override final { void omethod() {} }; %} %rename(Space1_final) Space1::final; %inline %{ namespace Space1 { struct final final { void finalmethod() {} final() {} final(const final &other) = default; final& operator=(const final &other) = default; }; struct FinalClass5 final { void method5() {} final final_member_var; final get_final_member() { return final_member_var; } Space1::final get_final_member2() { return final_member_var; } }; struct FinalClass6 { void method6() {} virtual void final() final {} virtual ~FinalClass6() = default; }; typedef final Space1_final_typedef1; typedef struct final Space1_final_typedef2; } typedef Space1::final Space1_final_typedef3; typedef struct Space1::final Space1_final_typedef4; %} %inline %{ namespace Space2 { class Y { public: Y(int i=0) {} }; struct FinalVar1 { class Y notfinal; // class Y final; // SWIG (C++ only) fails to parse (same for struct and union) }; struct FinalVar2 { class Y notfinal = {}; // class Y final = {}; // SWIG (C++ only) fails to parse (same for struct and union) }; struct FinalVar3 { class Y notfinal = Y(); // class Y final = Y(); // SWIG (C++ only) fails to parse (same for struct and union) }; struct FinalVar4 { class Y* final; FinalVar4() : final() {} }; struct FinalVar5 { Y final; }; struct FinalVar6 { Y final = {}; }; struct FinalVar7 { Y final = Y(); }; struct FinalVar8 { Y final{}; }; struct FinalVar9 { Y final{9}; }; struct FinalVar10 { void b10(Y final) {} }; } %} // Unfortunately the use of final in BrokenSpace does not work with Visual C++ // so we limit testing to parsing these by SWIG and then ignoring it all. %ignore BrokenSpace::FinalVar11; %ignore BrokenSpace::FinalEnum1; %ignore BrokenSpace::FinalEnum2; namespace BrokenSpace { using Space2::Y; struct FinalVar11 { void a11(class Y final) {} }; struct FinalEnum1 { enum Enum1 { one, two, final }; void enum_in(Enum1 e) {} }; struct FinalEnum2 { enum Enum2 { one, two, three, four }; enum Enum2 final; }; } %rename(Space3_final) Space3::final; %inline %{ namespace Space3 { typedef struct final { void fmethod() {} } final; } %}