diff options
author | Reid Kleckner <rnk@google.com> | 2015-10-17 00:19:04 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2015-10-17 00:19:04 +0000 |
commit | f438a020bfc1cfe0ecabd996e2f05fcc809955de (patch) | |
tree | 181dcb7d49bb4f2a08daea80939e9730430032b7 /clang/lib/Sema/TreeTransform.h | |
parent | 4f43e80ecef00cc150e177bb0cdf8a2685b264a0 (diff) | |
download | bcm5719-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.h | 12 |
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. |