diff options
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 8 | ||||
-rw-r--r-- | test/SemaTemplate/current-instantiation.cpp | 9 |
2 files changed, 11 insertions, 6 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 1506fbaf60..d32b3a97cd 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -673,12 +673,8 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc, if (SS && SS->isInvalid()) return ExprError(); - // C++ [temp.dep.expr]p3: - // An id-expression is type-dependent if it contains: - // -- a nested-name-specifier that contains a class-name that - // names a dependent type. - // FIXME: Member of the current instantiation. - if (SS && isDependentScopeSpecifier(*SS)) { + // Determine whether this is a member of an unknown specialization. + if (SS && SS->isSet() && !computeDeclContext(*SS, false)) { return Owned(new (Context) DependentScopeDeclRefExpr(Name, Context.DependentTy, Loc, SS->getRange(), static_cast<NestedNameSpecifier *>(SS->getScopeRep()), diff --git a/test/SemaTemplate/current-instantiation.cpp b/test/SemaTemplate/current-instantiation.cpp index a1d9fcb537..fe2c558a3d 100644 --- a/test/SemaTemplate/current-instantiation.cpp +++ b/test/SemaTemplate/current-instantiation.cpp @@ -142,3 +142,12 @@ struct X0<T*, U*> { void g8(typename ::X0<typename X0<T_type*, U*>::X2::my_T_type*, U_type*>::X2::my_T_type&); // expected-error{{redecl}} }; }; + +template<typename T> +struct X1 { + static int *a; + void f(float *b) { + X1<T>::a = b; // expected-error{{incompatible}} + X1<T*>::a = b; + } +}; |