| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- // RUN: %clang_cc1 -fsyntax-only -verify %s
- // A type-parameter defines its identifier to be a type-name (if
- // declared with class or typename) or template-name (if declared with
- // template) in the scope of the template declaration.
- template<typename T> struct X0 {
- T* value;
- };
- template<template<class T> class Y> struct X1 {
- Y<int> value;
- };
- // [Note: because of the name lookup rules, a template-parameter that
- // could be interpreted as either a non-type template-parameter or a
- // type-parameter (because its identifier is the name of an already
- // existing class) is taken as a type-parameter. For example,
- class T { /* ... */ }; // expected-note{{candidate constructor (the implicit copy constructor) not viable}}
- int i;
- template<class T, T i> struct X2 {
- void f(T t)
- {
- T t1 = i; //template-parameters T and i
- ::T t2 = ::i; // global namespace members T and i \
- // expected-error{{no viable conversion}}
- }
- };
- namespace PR6831 {
- namespace NA { struct S; }
- namespace NB { struct S; }
- using namespace NA;
- using namespace NB;
- template <typename S> void foo();
- template <int S> void bar();
- template <template<typename> class S> void baz();
- }
|