forked from OSchip/llvm-project
Allow the parser to recover gracefully if a typename is used to introduce a decltype type.
In Microsoft mode, we emit a warning instead of an error. This fixes a couple of errors when parsing the MSVC 11 RC headers with clang. llvm-svn: 160613
This commit is contained in:
parent
0e2b84312f
commit
f5b24e0136
|
@ -1334,10 +1334,12 @@ bool Parser::TryAnnotateTypeOrScopeToken(bool EnteringContext, bool NeedType) {
|
|||
0, /*IsTypename*/true))
|
||||
return true;
|
||||
if (!SS.isSet()) {
|
||||
if (Tok.is(tok::identifier) || Tok.is(tok::annot_template_id)) {
|
||||
if (Tok.is(tok::identifier) || Tok.is(tok::annot_template_id) ||
|
||||
Tok.is(tok::annot_decltype)) {
|
||||
// Attempt to recover by skipping the invalid 'typename'
|
||||
if (!TryAnnotateTypeOrScopeToken(EnteringContext, NeedType) &&
|
||||
Tok.isAnnotation()) {
|
||||
if (Tok.is(tok::annot_decltype) ||
|
||||
(!TryAnnotateTypeOrScopeToken(EnteringContext, NeedType) &&
|
||||
Tok.isAnnotation())) {
|
||||
unsigned DiagID = diag::err_expected_qualified_after_typename;
|
||||
// MS compatibility: MSVC permits using known types with typename.
|
||||
// e.g. "typedef typename T* pointer_type"
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
typedef unsigned short char16_t;
|
||||
typedef unsigned int char32_t;
|
||||
|
||||
typename decltype(3) a; // expected-warning {{expected a qualified name after 'typename'}}
|
||||
|
||||
namespace ms_conversion_rules {
|
||||
|
||||
void f(float a);
|
||||
|
|
Loading…
Reference in New Issue