1// PR c++/20172
2// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
3
4template<typename T> struct A
5{
6  template<T> int foo();                        // { dg-error "double" }
7  template<template<T> class> int bar();        // { dg-error "double" }
8  template<T> struct X;                         // { dg-error "double" }
9};
10
11A<char>   a1;
12A<double> a2;                                   // { dg-message "required" }
13
14template<typename T> struct B
15{
16  template<double> int foo();                   // { dg-error "double" }
17  template<template<double> class> int bar();   // { dg-error "double" }
18  template<double> struct X;                    // { dg-error "double" }
19};
20
21template<void> int foo();                       // { dg-error "void" }
22template<template<void> class> int bar();       // { dg-error "void" }
23template<void> struct X;                        // { dg-error "void" }
24
25template<typename T> struct C
26{
27  template<T> int foo();                        // { dg-error "double" }
28};
29
30template<typename T> int baz(T) { C<T> c; }     // { dg-message "required" }
31
32void foobar()
33{
34  baz(1.2);                                     // { dg-message "required" }
35}
36