summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/TreeTransform.h
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2015-10-17 00:19:04 +0000
committerReid Kleckner <rnk@google.com>2015-10-17 00:19:04 +0000
commitf438a020bfc1cfe0ecabd996e2f05fcc809955de (patch)
tree181dcb7d49bb4f2a08daea80939e9730430032b7 /clang/lib/Sema/TreeTransform.h
parent4f43e80ecef00cc150e177bb0cdf8a2685b264a0 (diff)
downloadbcm5719-llvm-f438a020bfc1cfe0ecabd996e2f05fcc809955de.tar.gz
bcm5719-llvm-f438a020bfc1cfe0ecabd996e2f05fcc809955de.zip
Diagnose UnresolvedLookupExprs that resolve to instance members in static methods
During the initial template parse for this code, 'member' is unresolved and we don't know anything about it: struct A { int member }; template <typename T> struct B : public T { using T::member; static void f() { (void)member; // Could be static or non-static. } }; template class B<A>; The pattern declaration contains an UnresolvedLookupExpr rather than an UnresolvedMemberExpr because `f` is static, and `member` should never be a field. However, if the code is invalid, it may become a field, in which case we should diagnose it. Reviewers: rjmccall, rsmith Differential Revision: http://reviews.llvm.org/D6700 llvm-svn: 250592
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
-rw-r--r--clang/lib/Sema/TreeTransform.h12
1 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 31d69cbac35..81c56c2f2c6 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -9128,8 +9128,18 @@ TreeTransform<Derived>::TransformUnresolvedLookupExpr(
// If we have neither explicit template arguments, nor the template keyword,
// it's a normal declaration name.
- if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid())
+ if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
+ // If an UnresolvedLookupExpr resolved to an instance member, that's an
+ // error.
+ NamedDecl *D = R.getAsSingle<NamedDecl>();
+ if (D && D->isCXXInstanceMember()) {
+ SemaRef.DiagnoseInstanceReference(SS, D, Old->getNameInfo());
+ R.clear();
+ return ExprError();
+ }
+
return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
+ }
// If we have template arguments, rebuild them, then rebuild the
// templateid expression.
OpenPOWER on IntegriCloud