1b1ce9297371b65b3726c09e85aed9781f70bca14Richard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s 20dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson 30dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlssontemplate<typename T> struct A { 40dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson void f() { } 57ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall struct N { }; // expected-note{{target of using declaration}} 60dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson}; 70dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson 80dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlssontemplate<typename T> struct B : A<T> { 90dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson using A<T>::f; 107ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall using A<T>::N; // expected-error{{dependent using declaration resolved to type without 'typename'}} 110dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson 120dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson using A<T>::foo; // expected-error{{no member named 'foo'}} 13604e7f14d672af80ca5b9044f30f3dc23d37ddd5John McCall using A<double>::f; // expected-error{{using declaration refers into 'A<double>::', which is not a base class of 'B<int>'}} 140dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson}; 150dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson 167c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallB<int> a; // expected-note{{in instantiation of template class 'B<int>' requested here}} 1736ef0787532ef3ecfc8ecd5e9661f5b2f87a280fAnders Carlsson 1836ef0787532ef3ecfc8ecd5e9661f5b2f87a280fAnders Carlssontemplate<typename T> struct C : A<T> { 1936ef0787532ef3ecfc8ecd5e9661f5b2f87a280fAnders Carlsson using A<T>::f; 2036ef0787532ef3ecfc8ecd5e9661f5b2f87a280fAnders Carlsson 2136ef0787532ef3ecfc8ecd5e9661f5b2f87a280fAnders Carlsson void f() { }; 2236ef0787532ef3ecfc8ecd5e9661f5b2f87a280fAnders Carlsson}; 23203cb71998a39a9d01a29db135454a9e7f402235Anders Carlsson 24203cb71998a39a9d01a29db135454a9e7f402235Anders Carlssontemplate <typename T> struct D : A<T> { 25203cb71998a39a9d01a29db135454a9e7f402235Anders Carlsson using A<T>::f; 26203cb71998a39a9d01a29db135454a9e7f402235Anders Carlsson 27203cb71998a39a9d01a29db135454a9e7f402235Anders Carlsson void f(); 28203cb71998a39a9d01a29db135454a9e7f402235Anders Carlsson}; 29203cb71998a39a9d01a29db135454a9e7f402235Anders Carlsson 30203cb71998a39a9d01a29db135454a9e7f402235Anders Carlssontemplate<typename T> void D<T>::f() { } 31598da5b01fa9e205f55db8b3b5cb20abec2d74cfAnders Carlsson 32598da5b01fa9e205f55db8b3b5cb20abec2d74cfAnders Carlssontemplate<typename T> struct E : A<T> { 33598da5b01fa9e205f55db8b3b5cb20abec2d74cfAnders Carlsson using A<T>::f; 34598da5b01fa9e205f55db8b3b5cb20abec2d74cfAnders Carlsson 35598da5b01fa9e205f55db8b3b5cb20abec2d74cfAnders Carlsson void g() { f(); } 36598da5b01fa9e205f55db8b3b5cb20abec2d74cfAnders Carlsson}; 37ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 38ed97649e9574b9d854fa4d6109c9333ae0993554John McCallnamespace test0 { 39ed97649e9574b9d854fa4d6109c9333ae0993554John McCall struct Base { 40ed97649e9574b9d854fa4d6109c9333ae0993554John McCall int foo; 41ed97649e9574b9d854fa4d6109c9333ae0993554John McCall }; 42ed97649e9574b9d854fa4d6109c9333ae0993554John McCall template<typename T> struct E : Base { 43ed97649e9574b9d854fa4d6109c9333ae0993554John McCall using Base::foo; 44ed97649e9574b9d854fa4d6109c9333ae0993554John McCall }; 45ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 46ed97649e9574b9d854fa4d6109c9333ae0993554John McCall template struct E<int>; 47ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 48c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis 49c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis// PR7896 50c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidisnamespace PR7896 { 51c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidistemplate <class T> struct Foo { 52c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis int k (float); 53c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis}; 54c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidisstruct Baz { 55c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis int k (int); 56c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis}; 57c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidistemplate <class T> struct Bar : public Foo<T>, Baz { 58c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis using Foo<T>::k; 59c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis using Baz::k; 60c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis int foo() { 61c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis return k (1.0f); 62c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis } 63c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis}; 64c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidistemplate int Bar<int>::foo(); 65c80117e7971c34088f3e254c849ec3a40205d2c3Argyrios Kyrtzidis} 6682340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain 6782340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain// PR10883 6882340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrainnamespace PR10883 { 6982340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain template <typename T> 7082340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain class Base { 7182340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain public: 7282340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain typedef long Container; 7382340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain }; 7482340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain 7582340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain template <typename T> 7682340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain class Derived : public Base<T> { 7782340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain public: 7882340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain using Base<T>::Container; 7982340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain 8082340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain void foo(const Container& current); // expected-error {{unknown type name 'Container'}} 8182340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain }; 8282340e8cbd353ae4ddb545f61ba9816c8d69ba8eKaelyn Uhrain} 83896436706037daf3c24e66bb95cb6ef9750a15b0Eli Friedman 84896436706037daf3c24e66bb95cb6ef9750a15b0Eli Friedmantemplate<typename T> class UsingTypenameNNS { 85896436706037daf3c24e66bb95cb6ef9750a15b0Eli Friedman using typename T::X; 86896436706037daf3c24e66bb95cb6ef9750a15b0Eli Friedman typename X::X x; 87896436706037daf3c24e66bb95cb6ef9750a15b0Eli Friedman}; 88b1ce9297371b65b3726c09e85aed9781f70bca14Richard Smith 89b1ce9297371b65b3726c09e85aed9781f70bca14Richard Smithnamespace aliastemplateinst { 90b1ce9297371b65b3726c09e85aed9781f70bca14Richard Smith template<typename T> struct A { }; 91b1ce9297371b65b3726c09e85aed9781f70bca14Richard Smith template<typename T> using APtr = A<T*>; // expected-note{{previous use is here}} 92b1ce9297371b65b3726c09e85aed9781f70bca14Richard Smith 93b1ce9297371b65b3726c09e85aed9781f70bca14Richard Smith template struct APtr<int>; // expected-error{{elaborated type refers to a non-tag type}} 94b1ce9297371b65b3726c09e85aed9781f70bca14Richard Smith} 95