1fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
2fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor
3fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregornamespace PR6915 {
4fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  template <typename T>
5fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  class D {
6fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor    enum T::X v; // expected-error{{use of 'X' with tag type that does not match previous declaration}} \
7fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor    // expected-error{{no enum named 'X' in 'PR6915::D3'}}
8fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  };
9fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor
10fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  struct D1 {
11fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor    enum X { value };
12fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  };
13fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  struct D2 {
14fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor    class X { }; // expected-note{{previous use is here}}
15fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  };
16fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  struct D3 { };
17fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor
18fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  template class D<D1>;
19fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  template class D<D2>; // expected-note{{in instantiation of}}
20fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  template class D<D3>; // expected-note{{in instantiation of}}
21fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor}
22fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor
23fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregortemplate<typename T>
24fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregorstruct DeclOrDef {
25fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  enum T::foo; // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}}
26fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  enum T::bar { // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}}
27fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor    value
28fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  };
29fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor};
30fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor
31fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregornamespace PR6649 {
32fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  template <typename T> struct foo {
33fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor    class T::bar;  // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}}
3444c7afc7c863af72b2ee124e4171389ca79209e5Douglas Gregor    class T::bar { int x; }; // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}}
35fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor  };
36fdf43162f6fe27ae92d0e64bd70a59bba40db42dDouglas Gregor}
37539d36b61c554e12dd8cd24c455af051785f44abJohn McCall
38539d36b61c554e12dd8cd24c455af051785f44abJohn McCallnamespace rdar8568507 {
39539d36b61c554e12dd8cd24c455af051785f44abJohn McCall  template <class T> struct A *makeA(T t);
40539d36b61c554e12dd8cd24c455af051785f44abJohn McCall}
41