From db2630fb043da9437dc8783cd0c7a94e8f4fe5e0 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Sun, 21 Oct 2012 03:28:35 +0000 Subject: Unrevert r166268, reverted in r166272, with a fix for the issue which Nick found: if an overloaded operator& is present before a template definition, the expression &T::foo is represented as a CXXOperatorCallExpr, not as a UnaryOperator, so we didn't notice that it's permitted to reference a non-static data member of an unrelated class. While investigating this, I discovered another problem in this area: we are treating template default arguments as unevaluated contexts during substitution, resulting in performing incorrect checks for uses of non-static data members in C++11. That is not fixed by this patch (I'll look into this soon; it's related to the failure to correctly instantiate constexpr function templates), but was resulting in this bug not firing in C++11 mode (except with -Wc++98-compat). Original message: PR14124: When performing template instantiation of a qualified-id outside of a class, diagnose if the qualified-id instantiates to a non-static class member. llvm-svn: 166385 --- clang/test/SemaTemplate/instantiate-member-expr.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'clang/test/SemaTemplate/instantiate-member-expr.cpp') diff --git a/clang/test/SemaTemplate/instantiate-member-expr.cpp b/clang/test/SemaTemplate/instantiate-member-expr.cpp index a31569a0c39..6ba94b28df6 100644 --- a/clang/test/SemaTemplate/instantiate-member-expr.cpp +++ b/clang/test/SemaTemplate/instantiate-member-expr.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic template struct S { S() { } @@ -66,3 +66,18 @@ namespace test2 { template class B; } + +namespace PR14124 { + template struct S { + int value; + }; + template void f() { S::value; } // expected-error {{invalid use of non-static data member 'value'}} + template void f(); // expected-note {{in instantiation of}} + + struct List { List *next; }; + template struct A {}; + A a; // ok + void operator&(struct Whatever); + template struct B {}; + B b; // still ok +} -- cgit v1.2.3