]> granicus.if.org Git - clang/commitdiff
Add support for #pragma mark, which shouldn't warn about bogus tokens.
authorChris Lattner <sabre@nondot.org>
Wed, 19 Dec 2007 19:38:36 +0000 (19:38 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 19 Dec 2007 19:38:36 +0000 (19:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45212 91177308-0d34-0410-b5e6-96231b3b80d8

Lex/Pragma.cpp
include/clang/Lex/Preprocessor.h
test/Lexer/pragma-mark.c [new file with mode: 0644]

index 05e524c0c1342ba34df096a01af5ddedb9aea245..f32e06bbcdee88a6a5e6c5cd334407213f1826a1 100644 (file)
@@ -177,6 +177,12 @@ void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
   HeaderInfo.MarkFileIncludeOnce(SourceMgr.getFileEntryForLoc(FileLoc));
 }
 
+void Preprocessor::HandlePragmaMark() {
+  assert(CurLexer && "No current lexer?");
+  CurLexer->ReadToEndOfLine();
+}
+
+
 /// HandlePragmaPoison - Handle #pragma GCC poison.  PoisonTok is the 'poison'.
 ///
 void Preprocessor::HandlePragmaPoison(Token &PoisonTok) {
@@ -323,6 +329,7 @@ void Preprocessor::AddPragmaHandler(const char *Namespace,
 }
 
 namespace {
+/// PragmaOnceHandler - "#pragma once" marks the file as atomically included.
 struct PragmaOnceHandler : public PragmaHandler {
   PragmaOnceHandler(const IdentifierInfo *OnceID) : PragmaHandler(OnceID) {}
   virtual void HandlePragma(Preprocessor &PP, Token &OnceTok) {
@@ -331,6 +338,16 @@ struct PragmaOnceHandler : public PragmaHandler {
   }
 };
 
+/// PragmaMarkHandler - "#pragma mark ..." is ignored by the compiler, and the
+/// rest of the line is not lexed.
+struct PragmaMarkHandler : public PragmaHandler {
+  PragmaMarkHandler(const IdentifierInfo *MarkID) : PragmaHandler(MarkID) {}
+  virtual void HandlePragma(Preprocessor &PP, Token &MarkTok) {
+    PP.HandlePragmaMark();
+  }
+};
+
+/// PragmaPoisonHandler - "#pragma poison x" marks x as not usable.
 struct PragmaPoisonHandler : public PragmaHandler {
   PragmaPoisonHandler(const IdentifierInfo *ID) : PragmaHandler(ID) {}
   virtual void HandlePragma(Preprocessor &PP, Token &PoisonTok) {
@@ -338,6 +355,8 @@ struct PragmaPoisonHandler : public PragmaHandler {
   }
 };
 
+/// PragmaSystemHeaderHandler - "#pragma system_header" marks the current file
+/// as a system header, which silences warnings in it.
 struct PragmaSystemHeaderHandler : public PragmaHandler {
   PragmaSystemHeaderHandler(const IdentifierInfo *ID) : PragmaHandler(ID) {}
   virtual void HandlePragma(Preprocessor &PP, Token &SHToken) {
@@ -358,6 +377,7 @@ struct PragmaDependencyHandler : public PragmaHandler {
 /// #pragma GCC poison/system_header/dependency and #pragma once.
 void Preprocessor::RegisterBuiltinPragmas() {
   AddPragmaHandler(0, new PragmaOnceHandler(getIdentifierInfo("once")));
+  AddPragmaHandler(0, new PragmaMarkHandler(getIdentifierInfo("mark")));
   AddPragmaHandler("GCC", new PragmaPoisonHandler(getIdentifierInfo("poison")));
   AddPragmaHandler("GCC", new PragmaSystemHeaderHandler(
                                           getIdentifierInfo("system_header")));
index c8c1da6b6ef521dba5b3af0c4d9775b42f6a1f88..a92962f423e4e8ee5079a054e531203f7f5d7903 100644 (file)
@@ -494,6 +494,7 @@ private:
   void HandlePragmaDirective();
 public:
   void HandlePragmaOnce(Token &OnceTok);
+  void HandlePragmaMark();
   void HandlePragmaPoison(Token &PoisonTok);
   void HandlePragmaSystemHeader(Token &SysHeaderTok);
   void HandlePragmaDependency(Token &DependencyTok);
diff --git a/test/Lexer/pragma-mark.c b/test/Lexer/pragma-mark.c
new file mode 100644 (file)
index 0000000..388fef5
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: clang %s -fsyntax-only -verify
+
+// Lexer diagnostics shouldn't be included in #pragma mark.
+#pragma mark Mike's world
+_Pragma("mark foo ' bar")
+
+#define X(S) _Pragma(S)
+X("mark foo ' bar")
+
+int i;
+