// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// RUN: cxx_compiler cxx_11 -c %s -o %t.o
// RUN: bindump %t.o | FileCheck prefixes %s

class bar {};
// return types
// CHECK-DAG: _Z3fooI3barEPvv
template <typename T> void* foo();
template<> void* foo<bar>() { return 0; }

// CHECK-DAG: _Z3fooI3barEKiv
template <typename T> int const foo();
template<> int const foo<bar>() { return 0; }

// CHECK-DAG: _Z4foo2IiEPFivET_
template <typename T> int (* foo2(T))();
template <> int (* foo2<int>(int))() { return 0; }

// CHECK-DAG: _Z4foo3IiEPFT_vES0_
template <typename T> T (* foo3(T))();
template <> int (* foo3<int>(int))() { return 0; }

// CHECK-DAG: _Z4foo4IPFcvEET_S2_
template <typename T> T foo4(T);
template <> char (* foo4<char (*)()>(char (*)()))() { return 0; }

// CHECK-DAG: _Z4foo5IPFcvEET_RKS2_
template <typename T> T foo5(const T &);
template <> char (* foo5<char (*)()>(char (* const&)()))() { return 0; }

// CHECK-DAG: _Z4foo6IPFcvEEPT_RKS2_
template <typename T> T* foo6(const T &);
template <> char (** foo6<char (*)()>(char (* const&)()))() { return 0; }

// CHECK-DAG: _Z4foo6IM3bazFvvEEPT_RKS3_
class baz {};
template <> void (baz::** foo6<void (baz::*)()>(void (baz::* const&)()))() { return 0; }

// CHECK-DAG: _Z4foo6IM3bazcEPT_RKS2_
template <> char baz::** foo6<char baz::*>(char baz::* const&) { return 0; }


