#ifndef TEST_INTEROP_CXX_NAMESPACE_INPUTS_TEMPLATES_H #define TEST_INTEROP_CXX_NAMESPACE_INPUTS_TEMPLATES_H namespace TemplatesNS1 { template const char *basicFunctionTemplate(T) __attribute__((swift_attr("import_unsafe"))) { return "TemplatesNS1::basicFunctionTemplate"; } template struct BasicClassTemplate { const char *basicMember() __attribute__((swift_attr("import_unsafe"))) { return "TemplatesNS1::BasicClassTemplate::basicMember"; } }; using BasicClassTemplateChar = BasicClassTemplate; } // namespace TemplatesNS1 namespace TemplatesNS1 { namespace TemplatesNS2 { template const char *forwardDeclaredFunctionTemplate(T); template struct ForwardDeclaredClassTemplate; template const char *forwardDeclaredFunctionTemplateOutOfLine(T); template struct ForwardDeclaredClassTemplateOutOfLine; } // namespace TemplatesNS2 } // namespace TemplatesNS1 namespace TemplatesNS1 { template const char *TemplatesNS2::forwardDeclaredFunctionTemplate(T) __attribute__((swift_attr("import_unsafe"))) { return "TemplatesNS1::TemplatesNS2::forwardDeclaredFunctionTemplate"; } template struct TemplatesNS2::ForwardDeclaredClassTemplate { const char *basicMember() __attribute__((swift_attr("import_unsafe"))) { return "TemplatesNS1::TemplatesNS2::ForwardDeclaredClassTemplate::basicMember"; } }; using ForwardDeclaredClassTemplateChar = TemplatesNS2::ForwardDeclaredClassTemplate; } // namespace TemplatesNS1 template const char * TemplatesNS1::TemplatesNS2::forwardDeclaredFunctionTemplateOutOfLine(T) { return "TemplatesNS1::TemplatesNS2::forwardDeclaredFunctionTemplateOutOfLine"; } template struct TemplatesNS1::TemplatesNS2::ForwardDeclaredClassTemplateOutOfLine { const char *basicMember() __attribute__((swift_attr("import_unsafe"))) { return "TemplatesNS1::TemplatesNS2::ForwardDeclaredClassTemplateOutOfLine::" "basicMember"; } }; using ForwardDeclaredClassTemplateOutOfLineChar = TemplatesNS1::TemplatesNS2::ForwardDeclaredClassTemplateOutOfLine; namespace TemplatesNS1 { namespace TemplatesNS3 { template struct BasicClassTemplate {}; } // namespace TemplatesNS3 } // namespace TemplatesNS1 namespace TemplatesNS1 { namespace TemplatesNS2 { using BasicClassTemplateChar = TemplatesNS3::BasicClassTemplate; inline const char *takesClassTemplateFromSibling(BasicClassTemplateChar) { return "TemplatesNS1::TemplatesNS2::takesClassTemplateFromSibling"; } } // namespace TemplatesNS2 } // namespace TemplatesNS1 namespace TemplatesNS4 { template struct HasSpecialization {}; template <> struct HasSpecialization {}; } // namespace TemplatesNS4 namespace TemplatesNS1 { using UseTemplate = TemplatesNS4::HasSpecialization; using UseSpecialized = TemplatesNS4::HasSpecialization; } // namespace TemplatesNS1 namespace TemplatesNS1 { template const char *basicFunctionTemplateDefinedInDefs(T); template struct BasicClassTemplateDefinedInDefs; } // namespace TemplatesNS1 #endif // TEST_INTEROP_CXX_NAMESPACE_INPUTS_TEMPLATES_H