From 3176e97f130184ece0e1a21352c8124cc83ff24a Mon Sep 17 00:00:00 2001 From: dim Date: Wed, 30 Dec 2015 11:49:41 +0000 Subject: Vendor import of clang trunk r256633: https://llvm.org/svn/llvm-project/cfe/trunk@256633 --- test/SemaTemplate/instantiate-using-decl.cpp | 65 +++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) (limited to 'test/SemaTemplate/instantiate-using-decl.cpp') diff --git a/test/SemaTemplate/instantiate-using-decl.cpp b/test/SemaTemplate/instantiate-using-decl.cpp index a6a4ea0..0bbb3ca 100644 --- a/test/SemaTemplate/instantiate-using-decl.cpp +++ b/test/SemaTemplate/instantiate-using-decl.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++98 -fsyntax-only -verify %s namespace test0 { namespace N { } @@ -104,3 +105,65 @@ namespace PR16936 { x.f(); } } + +namespace pr21923 { +template struct Base { + int field; + void method(); +}; +template struct Derived : Base { + using Base::field; + using Base::method; + static void m_fn1() { + // expected-error@+1 {{invalid use of member 'field' in static member function}} + (void)field; + // expected-error@+1 {{invalid use of member 'field' in static member function}} + (void)&field; + // expected-error@+1 {{call to non-static member function without an object argument}} + (void)method; + // expected-error@+1 {{call to non-static member function without an object argument}} + (void)&method; + // expected-error@+1 {{call to non-static member function without an object argument}} + method(); + (void)&Base::field; + (void)&Base::method; + } +#if __cplusplus >= 201103L + // These usages are OK in C++11 due to the unevaluated context. + enum { TheSize = sizeof(field) }; + typedef decltype(field) U; +#else + // expected-error@+1 {{invalid use of non-static data member 'field'}} + enum { TheSize = sizeof(field) }; +#endif +}; + +#if __cplusplus < 201103L +// C++98 has an extra note for TheSize. +// expected-note@+2 {{requested here}} +#endif +template class Derived; // expected-note {{requested here}} + +// This is interesting because we form an UnresolvedLookupExpr in the static +// function template and an UnresolvedMemberExpr in the instance function +// template. As a result, we get slightly different behavior. +struct UnresolvedTemplateNames { + template void maybe_static(); +#if __cplusplus < 201103L + // expected-warning@+2 {{default template arguments for a function template are a C++11 extension}} +#endif + template static void maybe_static(); + + template + void instance_method() { (void)maybe_static(); } + template + static void static_method() { + // expected-error@+1 {{call to non-static member function without an object argument}} + (void)maybe_static(); + } +}; +void force_instantiation(UnresolvedTemplateNames x) { + x.instance_method(); + UnresolvedTemplateNames::static_method(); // expected-note {{requested here}} +} +} // pr21923 -- cgit v1.1