// RUN: %clang_cc1 -fsyntax-only -verify %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s // PR4607 template <class T> struct X {}; template <> struct X<char> { static char* g(); }; template <class T> struct X2 {}; template <class U> struct X2<U*> { static void f() { X<U>::g(); } }; void a(char *a, char *b) {X2<char*>::f();} namespace WonkyAccess { template<typename T> struct X { int m; }; template<typename U> class Y; template<typename U> struct Y<U*> : X<U> { }; template<> struct Y<float*> : X<float> { }; int f(Y<int*> y, Y<float*> y2) { return y.m + y2.m; } } // <rdar://problem/9169404> namespace rdar9169404 { template<typename T, T N> struct X { }; template<bool C> struct X<bool, C> { typedef int type; }; X<bool, -1>::type value; #if __cplusplus >= 201103L // expected-error@-2 {{non-type template argument evaluates to -1, which cannot be narrowed to type 'bool'}} #else // expected-no-diagnostics #endif }