@@ -1919,9 +1919,11 @@ destringize_and_run (cpp_reader *pfile, const cpp_string *in,
until we've read all of the tokens that we want. */
cpp_push_buffer (pfile, (const uchar *) result, dest - result,
/* from_stage3 */ true);
- /* ??? Antique Disgusting Hack. What does this do? */
- if (pfile->buffer->prev)
- pfile->buffer->file = pfile->buffer->prev->file;
+
+ /* This is needed for _Pragma("once") and _Pragma("GCC system_header") to work
+ properly. */
+ pfile->buffer->file = pfile->buffer->prev->file;
+ pfile->buffer->sysp = pfile->buffer->prev->sysp;
start_directive (pfile);
_cpp_clean_line (pfile);
@@ -1986,6 +1988,9 @@ destringize_and_run (cpp_reader *pfile, const cpp_string *in,
/* Finish inlining run_directive. */
pfile->buffer->file = NULL;
+ /* If the system header state changed due to #pragma GCC system_header, then
+ make that applicable to the real buffer too. */
+ pfile->buffer->prev->sysp = pfile->buffer->sysp;
_cpp_pop_buffer (pfile);
/* Reset the old macro state before ... */
new file mode 100644
@@ -0,0 +1 @@
+#pragma GCC warning "this warning should not be output (1)"
new file mode 100644
@@ -0,0 +1,5 @@
+_Pragma("GCC system_header")
+#include "pragma-system-header-1.h"
+#pragma GCC warning "this warning should not be output (2)"
+_Pragma("unknown")
+#include "pragma-system-header-1.h"
new file mode 100644
@@ -0,0 +1,3 @@
+#include "pragma-system-header-2.h" /* { dg-bogus "this warning should not be output" } */
+/* { dg-do preprocess } */
+/* PR preprocessor/114436 */