Support '#pragma once' in headers when using PCH
authorSunil Srivastava <sunil_srivastava@playstation.sony.com>
Mon, 25 Jul 2016 17:17:06 +0000 (17:17 +0000)
committerSunil Srivastava <sunil_srivastava@playstation.sony.com>
Mon, 25 Jul 2016 17:17:06 +0000 (17:17 +0000)
The '#pragma once' directive was erroneously ignored when encountered
in the header-file specified in generate-PCH-mode. This resulted in
compile-time errors in some cases with legal code, and also a misleading
warning being produced.

Patch by Warren Ristow!

Differential Revision: http://reviews.llvm.org/D19815

llvm-svn: 276653

clang/lib/Lex/Pragma.cpp
clang/test/PCH/Inputs/pragma-once.h [new file with mode: 0644]
clang/test/PCH/pragma-once.c [new file with mode: 0644]

index d6e6517..1ce4b43 100644 (file)
@@ -352,7 +352,9 @@ void Preprocessor::HandleMicrosoft__pragma(Token &Tok) {
 /// HandlePragmaOnce - Handle \#pragma once.  OnceTok is the 'once'.
 ///
 void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
-  if (isInPrimaryFile()) {
+  // Don't honor the 'once' when handling the primary source file, unless
+  // this is a prefix to a TU, which indicates we're generating a PCH file.
+  if (isInPrimaryFile() && TUKind != TU_Prefix) {
     Diag(OnceTok, diag::pp_pragma_once_in_main_file);
     return;
   }
diff --git a/clang/test/PCH/Inputs/pragma-once.h b/clang/test/PCH/Inputs/pragma-once.h
new file mode 100644 (file)
index 0000000..831cf55
--- /dev/null
@@ -0,0 +1,5 @@
+#pragma once
+
+/* For use with the pragma-once.c test */
+
+int x = 3;
diff --git a/clang/test/PCH/pragma-once.c b/clang/test/PCH/pragma-once.c
new file mode 100644 (file)
index 0000000..15e8503
--- /dev/null
@@ -0,0 +1,13 @@
+// Test this without pch.
+// RUN: %clang_cc1 -include %S/Inputs/pragma-once.h -fsyntax-only -verify %s
+
+// Test with pch.
+// RUN: %clang_cc1 -emit-pch -o %t %S/Inputs/pragma-once.h
+// RUN: %clang_cc1 -include-pch %t -fsyntax-only -verify %s
+
+// expected-no-diagnostics
+
+// Including "pragma-once.h" twice, to verify the 'once' aspect is honored.
+#include "Inputs/pragma-once.h"
+#include "Inputs/pragma-once.h"
+int foo(void) { return 0; }