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