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