From: Francois Pichet Date: Sun, 22 Jul 2012 15:10:57 +0000 (+0000) Subject: Allow the parser to recover gracefully if a typename is used to introduce a decltype... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b67e7fc607671ef3df64de63c38545197e9992b2;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160613 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index e95af05411..760c7bf717 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -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" diff --git a/test/SemaCXX/MicrosoftCompatibility.cpp b/test/SemaCXX/MicrosoftCompatibility.cpp index 74d54ef994..6a48f36801 100644 --- a/test/SemaCXX/MicrosoftCompatibility.cpp +++ b/test/SemaCXX/MicrosoftCompatibility.cpp @@ -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);