Hi!
cp_lexer_new_from_tokens creates lexer that has NULL lexer->buffer,
calling lexer->buffer->address () therefore is UB (diagnosed by
--with-boot-config=bootstrap-ubsan).
The following patch fixes this, or Markus offered
gcc_assert (!lexer->buffer || tp != lexer->buffer->address ());
instead. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk (or do you prefer Markus' version)?
2017-01-03 Jakub Jelinek <[email protected]>
PR c++/71182
* parser.c (cp_lexer_previous_token): Use vec_safe_address in the
assertion, as lexer->buffer may be NULL.
* g++.dg/cpp0x/pr71182.C: New test.
--- gcc/cp/parser.c.jj 2017-01-03 09:58:13.000000000 +0100
+++ gcc/cp/parser.c 2017-01-03 11:39:56.940595981 +0100
@@ -766,7 +766,7 @@ cp_lexer_previous_token (cp_lexer *lexer
/* Skip past purged tokens. */
while (tp->purged_p)
{
- gcc_assert (tp != lexer->buffer->address ());
+ gcc_assert (tp != vec_safe_address (lexer->buffer));
tp--;
}
--- gcc/testsuite/g++.dg/cpp0x/pr71182.C.jj 2017-01-03 11:44:19.400246340
+0100
+++ gcc/testsuite/g++.dg/cpp0x/pr71182.C 2017-01-03 11:44:04.795432815
+0100
@@ -0,0 +1,12 @@
+// PR c++/71182
+// { dg-do compile { target c++11 } }
+
+class A {
+ template <typename> void As();
+};
+template <typename T> class B : A {
+ void f() {
+ A *g ;
+ g ? g->As<T>() : nullptr;
+ }
+};
Jakub