зеркало из https://github.com/microsoft/clang-1.git
Improve type-checking of templates by distinguishing between members
of the current instantiation and members of an unknown specialization when type-checking a qualified-if expression. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89653 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
7edfb69ae1
Коммит
ac564f3e8d
|
@ -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()),
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче