// RUN: %clang_cc1 -ast-print -std=c++14 %s | FileCheck %s namespace ns { struct Wrapper { class Inner { Inner(); Inner(int); ~Inner(); void operator += (int); template void member(); static void staticMember(); operator int(); operator ns::Wrapper(); // CHECK: operator ns::Wrapper() }; }; Wrapper::Inner::Inner() { } // CHECK: Wrapper::Inner::Inner() void Wrapper::Inner::operator +=(int) { } // CHECK: void Wrapper::Inner::operator+=(int) } ns::Wrapper::Inner::Inner(int) { } // CHECK: ns::Wrapper::Inner::Inner(int) ns::Wrapper::Inner::~Inner() { } // CHECK: ns::Wrapper::Inner::~Inner() template void ::ns::Wrapper::Inner::member() { } // CHECK: template void ::ns::Wrapper::Inner::member() ns::Wrapper::Inner::operator int() { return 0; } // CHECK: ns::Wrapper::Inner::operator int() ns::Wrapper::Inner::operator ::ns::Wrapper() { return ns::Wrapper(); } // CHECK: ns::Wrapper::Inner::operator ::ns::Wrapper() namespace ns { void Wrapper::Inner::staticMember() { } // CHECK: void Wrapper::Inner::staticMember() } template class TemplateRecord { void function(); template void functionTemplate(T, U); }; template void TemplateRecord::function() { } // CHECK: template void TemplateRecord::function() template template void TemplateRecord::functionTemplate(T, U) { } // CHECK: template template void TemplateRecord::functionTemplate(T, U) template<> class TemplateRecord<0, int> { void function(); template void functionTemplate(int, U); }; void TemplateRecord<0, int>::function() { } // CHECK: void TemplateRecord<0, int>::function() template void TemplateRecord<0, int>::functionTemplate(int, U) { } // CHECK: template void TemplateRecord<0, int>::functionTemplate(int, U) template struct OuterTemplateRecord { template struct Inner { void function(); }; }; template template void OuterTemplateRecord::Inner::function() { } // CHECK: template template void OuterTemplateRecord::Inner::function()