parser: improve diagnostics for MS attributes

Switch to using BalancedDelimiterTracker to get better diagnostics for
unbalanced delimiters.  This still does not handle any of the attributes, simply
improves the parsing.

llvm-svn: 239758
This commit is contained in:
Saleem Abdulrasool 2015-06-15 20:57:04 +00:00
parent 717820faa0
commit 425efcf6ea
2 changed files with 11 additions and 6 deletions

View File

@ -3780,7 +3780,7 @@ SourceLocation Parser::SkipCXX11Attributes() {
return EndLoc;
}
/// ParseMicrosoftAttributes - Parse a Microsoft attribute [Attr]
/// ParseMicrosoftAttributes - Parse Microsoft attributes [Attr]
///
/// [MS] ms-attribute:
/// '[' token-seq ']'
@ -3792,13 +3792,15 @@ void Parser::ParseMicrosoftAttributes(ParsedAttributes &attrs,
SourceLocation *endLoc) {
assert(Tok.is(tok::l_square) && "Not a Microsoft attribute list");
while (Tok.is(tok::l_square)) {
do {
// FIXME: If this is actually a C++11 attribute, parse it as one.
ConsumeBracket();
BalancedDelimiterTracker T(*this, tok::l_square);
T.consumeOpen();
SkipUntil(tok::r_square, StopAtSemi | StopBeforeMatch);
if (endLoc) *endLoc = Tok.getLocation();
ExpectAndConsume(tok::r_square);
}
T.consumeClose();
if (endLoc)
*endLoc = T.getCloseLocation();
} while (Tok.is(tok::l_square));
}
void Parser::ParseMicrosoftIfExistsClassDeclaration(DeclSpec::TST TagType,

View File

@ -52,6 +52,9 @@ void deprecated_enum_test(void) {
[returnvalue:SA_Post( attr=1)]
int foo1([SA_Post(attr=1)] void *param);
[unbalanced(attribute) /* expected-note {{to match this '['}} */
void f(void); /* expected-error {{expected ']'}} */
void ms_intrinsics(int a) {
__noop();
__assume(a);