diff options
Diffstat (limited to 'clang/lib/Parse/Parser.cpp')
| -rw-r--r-- | clang/lib/Parse/Parser.cpp | 20 | 
1 files changed, 16 insertions, 4 deletions
| diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 2645f27e656f..4249de361b89 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -278,6 +278,10 @@ bool Parser::SkipUntil(ArrayRef<tok::TokenKind> Toks, SkipUntilFlags Flags) {      case tok::annot_pragma_openmp:      case tok::annot_pragma_openmp_end:        // Stop before an OpenMP pragma boundary. +      if (OpenMPDirectiveParsing) +        return false; +      ConsumeAnnotationToken(); +      break;      case tok::annot_module_begin:      case tok::annot_module_end:      case tok::annot_module_include: @@ -799,7 +803,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,      SourceLocation StartLoc = Tok.getLocation();      SourceLocation EndLoc; -    ExprResult Result(ParseSimpleAsm(&EndLoc)); +    ExprResult Result(ParseSimpleAsm(/*ForAsmLabel*/ false, &EndLoc));      // Check if GNU-style InlineAsm is disabled.      // Empty asm string is allowed because it will not introduce @@ -1463,11 +1467,14 @@ void Parser::ParseKNRParamDeclarations(Declarator &D) {  /// ParseAsmStringLiteral - This is just a normal string-literal, but is not  /// allowed to be a wide string, and is not subject to character translation. +/// Unlike GCC, we also diagnose an empty string literal when parsing for an +/// asm label as opposed to an asm statement, because such a construct does not +/// behave well.  ///  /// [GNU] asm-string-literal:  ///         string-literal  /// -ExprResult Parser::ParseAsmStringLiteral() { +ExprResult Parser::ParseAsmStringLiteral(bool ForAsmLabel) {    if (!isTokenStringLiteral()) {      Diag(Tok, diag::err_expected_string_literal)        << /*Source='in...'*/0 << "'asm'"; @@ -1483,6 +1490,11 @@ ExprResult Parser::ParseAsmStringLiteral() {          << SL->getSourceRange();        return ExprError();      } +    if (ForAsmLabel && SL->getString().empty()) { +      Diag(Tok, diag::err_asm_operand_wide_string_literal) +          << 2 /* an empty */ << SL->getSourceRange(); +      return ExprError(); +    }    }    return AsmString;  } @@ -1492,7 +1504,7 @@ ExprResult Parser::ParseAsmStringLiteral() {  /// [GNU] simple-asm-expr:  ///         'asm' '(' asm-string-literal ')'  /// -ExprResult Parser::ParseSimpleAsm(SourceLocation *EndLoc) { +ExprResult Parser::ParseSimpleAsm(bool ForAsmLabel, SourceLocation *EndLoc) {    assert(Tok.is(tok::kw_asm) && "Not an asm!");    SourceLocation Loc = ConsumeToken(); @@ -1512,7 +1524,7 @@ ExprResult Parser::ParseSimpleAsm(SourceLocation *EndLoc) {      return ExprError();    } -  ExprResult Result(ParseAsmStringLiteral()); +  ExprResult Result(ParseAsmStringLiteral(ForAsmLabel));    if (!Result.isInvalid()) {      // Close the paren and get the location of the end bracket | 
