public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Lewis Hyatt <lhyatt@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r13-4217] libcpp: Fix paste error with unknown pragma after macro expansion
Date: Mon, 21 Nov 2022 23:04:09 +0000 (GMT)	[thread overview]
Message-ID: <20221121230409.EB5D5385843E@sourceware.org> (raw)

https://gcc.gnu.org/g:6f46d14d4989b2711379807e4565585123c48118

commit r13-4217-g6f46d14d4989b2711379807e4565585123c48118
Author: Lewis Hyatt <lhyatt@gmail.com>
Date:   Wed Nov 2 16:04:36 2022 -0400

    libcpp: Fix paste error with unknown pragma after macro expansion
    
    In directives.cc, do_pragma() contains logic to handle a case such as the new
    testcase pragma-omp-unknown.c, where an unknown pragma was the result of macro
    expansion (for pragma namespaces that permit expansion). This no longer works
    correctly as shown by the testcase, fixed by adding PREV_WHITE to the flags on
    the second token to prevent an unwanted paste.  Also fixed the memory leak,
    since the temporary tokens are pushed on their own context, nothing prevents
    freeing of the buffer that holds them when the context is eventually popped.
    
    libcpp/ChangeLog:
    
            * directives.cc (do_pragma): Fix memory leak in token buffer.  Fix
            unwanted paste between two tokens.
    
    gcc/testsuite/ChangeLog:
    
            * c-c++-common/gomp/pragma-omp-unknown.c: New test.

Diff:
---
 gcc/testsuite/c-c++-common/gomp/pragma-omp-unknown.c | 10 ++++++++++
 libcpp/directives.cc                                 | 10 +++++-----
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/gcc/testsuite/c-c++-common/gomp/pragma-omp-unknown.c b/gcc/testsuite/c-c++-common/gomp/pragma-omp-unknown.c
new file mode 100644
index 00000000000..04881f786ab
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/pragma-omp-unknown.c
@@ -0,0 +1,10 @@
+/* { dg-do preprocess } */
+/* { dg-options "-fopenmp" } */
+
+#define X UNKNOWN1
+#pragma omp X
+/* { dg-final { scan-file pragma-omp-unknown.i "#pragma omp UNKNOWN1" } } */
+
+#define Y UNKNOWN2
+_Pragma("omp Y")
+/* { dg-final { scan-file pragma-omp-unknown.i "#pragma omp UNKNOWN2" } } */
diff --git a/libcpp/directives.cc b/libcpp/directives.cc
index 918752f6b1f..9dc4363c65a 100644
--- a/libcpp/directives.cc
+++ b/libcpp/directives.cc
@@ -1565,15 +1565,15 @@ do_pragma (cpp_reader *pfile)
 	{
 	  /* Invalid name comes from macro expansion, _cpp_backup_tokens
 	     won't allow backing 2 tokens.  */
-	  /* ??? The token buffer is leaked.  Perhaps if def_pragma hook
-	     reads both tokens, we could perhaps free it, but if it doesn't,
-	     we don't know the exact lifespan.  */
-	  cpp_token *toks = XNEWVEC (cpp_token, 2);
+	  const auto tok_buff = _cpp_get_buff (pfile, 2 * sizeof (cpp_token));
+	  const auto toks = (cpp_token *)tok_buff->base;
 	  toks[0] = ns_token;
 	  toks[0].flags |= NO_EXPAND;
 	  toks[1] = *token;
-	  toks[1].flags |= NO_EXPAND;
+	  toks[1].flags |= NO_EXPAND | PREV_WHITE;
 	  _cpp_push_token_context (pfile, NULL, toks, 2);
+	  /* Arrange to free this buffer when no longer needed.  */
+	  pfile->context->buff = tok_buff;
 	}
       pfile->cb.def_pragma (pfile, pfile->directive_line);
     }

                 reply	other threads:[~2022-11-21 23:04 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221121230409.EB5D5385843E@sourceware.org \
    --to=lhyatt@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).