1// { dg-do assemble  }
2
3// Submitted by Erez Louidor Lior <s3824888@techst02.technion.ac.il>
4
5template <typename> class H;
6template <typename Target, typename Source>
7H<Target> foo(const H<Source>&);
8
9template <typename Type>
10class H{
11
12#ifdef OK
13public:
14#endif
15  template<template<class, class> class Caster, typename Source>
16  static H<Type> cast(const H<Source>& s);
17
18#ifndef OK
19  template <typename Target, typename Source>
20  friend H<Target> foo(const H<Source>&);
21#endif
22
23};
24
25template <class, class> class caster;
26
27template <typename Target, typename Source>
28H<Target> foo(const H<Source>& s){
29  return H<Target>::template cast<caster, Source>(s);
30}
31
32int main(){
33  H<int> i;
34  foo<const int>(i);
35}
36