// 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<typename T> 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<typename T> void ::ns::Wrapper::Inner::member() { } // CHECK: template <typename T> 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<int x, typename T> class TemplateRecord { void function(); template<typename U> void functionTemplate(T, U); }; template<int x, typename T> void TemplateRecord<x, T>::function() { } // CHECK: template <int x, typename T> void TemplateRecord<x, T>::function() template<int x, typename T> template<typename U> void TemplateRecord<x, T>::functionTemplate(T, U) { } // CHECK: template <int x, typename T> template <typename U> void TemplateRecord<x, T>::functionTemplate(T, U) template<> class TemplateRecord<0, int> { void function(); template<typename U> void functionTemplate(int, U); }; void TemplateRecord<0, int>::function() { } // CHECK: void TemplateRecord<0, int>::function() template<typename U> void TemplateRecord<0, int>::functionTemplate(int, U) { } // CHECK: template <typename U> void TemplateRecord<0, int>::functionTemplate(int, U) template<typename T> struct OuterTemplateRecord { template<typename U> struct Inner { void function(); }; }; template<typename T> template<typename U> void OuterTemplateRecord<T>::Inner<U>::function() { } // CHECK: template <typename T> template <typename U> void OuterTemplateRecord<T>::Inner<U>::function() |