summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Frontend/PrintPreprocessedOutput.cpp9
-rw-r--r--clang/lib/Lex/TokenConcatenation.cpp9
-rw-r--r--clang/test/Preprocessor/Inputs/a.h1
-rw-r--r--clang/test/Preprocessor/Inputs/module.map4
-rw-r--r--clang/test/Preprocessor/annot-tokens.m5
5 files changed, 20 insertions, 8 deletions
diff --git a/clang/lib/Frontend/PrintPreprocessedOutput.cpp b/clang/lib/Frontend/PrintPreprocessedOutput.cpp
index f3393bfe51c..834e5262c63 100644
--- a/clang/lib/Frontend/PrintPreprocessedOutput.cpp
+++ b/clang/lib/Frontend/PrintPreprocessedOutput.cpp
@@ -342,6 +342,7 @@ void PrintPPOutputPPCallbacks::InclusionDirective(SourceLocation HashLoc,
OS << "@import " << Imported->getFullModuleName() << ";"
<< " /* clang -E: implicit import for \"" << File->getName() << "\" */";
EmittedTokensOnThisLine = true;
+ setEmittedDirectiveOnThisLine();
}
}
@@ -657,11 +658,9 @@ static void PrintPreprocessedTokens(Preprocessor &PP, Token &Tok,
// -traditional-cpp the lexer keeps /all/ whitespace, including comments.
SourceLocation StartLoc = Tok.getLocation();
Callbacks->MoveToLine(StartLoc.getLocWithOffset(Tok.getLength()));
- } else if (Tok.is(tok::annot_module_include) ||
- Tok.is(tok::annot_module_begin) ||
- Tok.is(tok::annot_module_end)) {
- // PrintPPOutputPPCallbacks::InclusionDirective handles producing
- // appropriate output here. Ignore this token entirely.
+ } else if (Tok.isAnnotation()) {
+ // PrintPPOutputPPCallbacks handles producing appropriate output here.
+ // Ignore this token entirely.
PP.Lex(Tok);
continue;
} else if (IdentifierInfo *II = Tok.getIdentifierInfo()) {
diff --git a/clang/lib/Lex/TokenConcatenation.cpp b/clang/lib/Lex/TokenConcatenation.cpp
index 0a66bba91fc..9de28a875e7 100644
--- a/clang/lib/Lex/TokenConcatenation.cpp
+++ b/clang/lib/Lex/TokenConcatenation.cpp
@@ -163,8 +163,8 @@ bool TokenConcatenation::AvoidConcat(const Token &PrevPrevTok,
return false;
tok::TokenKind PrevKind = PrevTok.getKind();
- if (PrevTok.getIdentifierInfo()) // Language keyword or named operator.
- PrevKind = tok::identifier;
+ if (!PrevTok.isAnnotation() && PrevTok.getIdentifierInfo())
+ PrevKind = tok::identifier; // Language keyword or named operator.
// Look up information on when we should avoid concatenation with prevtok.
unsigned ConcatInfo = TokenInfo[PrevKind];
@@ -212,7 +212,7 @@ bool TokenConcatenation::AvoidConcat(const Token &PrevPrevTok,
// In C++11, a string or character literal followed by an identifier is a
// single token.
- if (Tok.getIdentifierInfo())
+ if (!Tok.isAnnotation() && Tok.getIdentifierInfo())
return true;
// A ud-suffix is an identifier. If the previous token ends with one, treat
@@ -225,6 +225,9 @@ bool TokenConcatenation::AvoidConcat(const Token &PrevPrevTok,
if (Tok.is(tok::numeric_constant))
return GetFirstChar(PP, Tok) != '.';
+ if (Tok.isAnnotation()) // token will be put on its own line.
+ return false;
+
if (Tok.getIdentifierInfo() || Tok.is(tok::wide_string_literal) ||
Tok.is(tok::utf8_string_literal) || Tok.is(tok::utf16_string_literal) ||
Tok.is(tok::utf32_string_literal) || Tok.is(tok::wide_char_constant) ||
diff --git a/clang/test/Preprocessor/Inputs/a.h b/clang/test/Preprocessor/Inputs/a.h
new file mode 100644
index 00000000000..8b1a393741c
--- /dev/null
+++ b/clang/test/Preprocessor/Inputs/a.h
@@ -0,0 +1 @@
+// empty
diff --git a/clang/test/Preprocessor/Inputs/module.map b/clang/test/Preprocessor/Inputs/module.map
new file mode 100644
index 00000000000..a96765705e1
--- /dev/null
+++ b/clang/test/Preprocessor/Inputs/module.map
@@ -0,0 +1,4 @@
+module a {
+ header "a.h"
+ export *
+}
diff --git a/clang/test/Preprocessor/annot-tokens.m b/clang/test/Preprocessor/annot-tokens.m
new file mode 100644
index 00000000000..c5312ee2ea8
--- /dev/null
+++ b/clang/test/Preprocessor/annot-tokens.m
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -E %s -fmodules -fmodules-cache-path=%t -I%S/Inputs | FileCheck %s
+// CHECK: @import a; /* clang -E: implicit import
+#include "a.h"
+// CHECK: #pragma clang __debug parser_crash
+#pragma clang __debug parser_crash
OpenPOWER on IntegriCloud