зеркало из https://github.com/microsoft/clang-1.git
Patch for PR 7409 - only error on definition of invalid typedefs. Suppress errors for additional uses of this invalid typedef.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131043 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
5cb0ef4aed
Коммит
00c93a10c3
|
@ -2568,9 +2568,13 @@ TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
|
||||||
Q.getLocalEndLoc());
|
Q.getLocalEndLoc());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// If the nested-name-specifier is an invalid type def, don't emit an
|
||||||
SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
|
// error because a previous error should have already been emitted.
|
||||||
<< TL.getType() << SS.getRange();
|
TypedefTypeLoc* TTL = dyn_cast<TypedefTypeLoc>(&TL);
|
||||||
|
if (!TTL || !TTL->getTypedefNameDecl()->isInvalidDecl()) {
|
||||||
|
SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
|
||||||
|
<< TL.getType() << SS.getRange();
|
||||||
|
}
|
||||||
return NestedNameSpecifierLoc();
|
return NestedNameSpecifierLoc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,3 +71,34 @@ struct C {
|
||||||
::Y<A>::type ip7 = &i;
|
::Y<A>::type ip7 = &i;
|
||||||
::Y<B>::type ip8 = &i; // expected-note{{in instantiation of template class 'Y<B>' requested here}}
|
::Y<B>::type ip8 = &i; // expected-note{{in instantiation of template class 'Y<B>' requested here}}
|
||||||
::Y<C>::type ip9 = &i; // expected-note{{in instantiation of template class 'Y<C>' requested here}}
|
::Y<C>::type ip9 = &i; // expected-note{{in instantiation of template class 'Y<C>' requested here}}
|
||||||
|
|
||||||
|
template<typename T> struct D {
|
||||||
|
typedef typename T::foo foo; // expected-error {{type 'long' cannot be used prior to '::' because it has no members}}
|
||||||
|
typedef typename foo::bar bar;
|
||||||
|
};
|
||||||
|
|
||||||
|
D<long> struct_D; // expected-note {{in instantiation of template class 'D<long>' requested here}}
|
||||||
|
|
||||||
|
template<typename T> struct E {
|
||||||
|
typedef typename T::foo foo;
|
||||||
|
typedef typename foo::bar bar; // expected-error {{type 'foo' (aka 'double') cannot be used prior to '::' because it has no members}}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct F {
|
||||||
|
typedef double foo;
|
||||||
|
};
|
||||||
|
|
||||||
|
E<F> struct_E; // expected-note {{in instantiation of template class 'E<F>' requested here}}
|
||||||
|
|
||||||
|
template<typename T> struct G {
|
||||||
|
typedef typename T::foo foo;
|
||||||
|
typedef typename foo::bar bar;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct H {
|
||||||
|
struct foo {
|
||||||
|
typedef double bar;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
G<H> struct_G;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче