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