aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2022-01-17 17:16:38 -0500
committerJason Merrill <jason@redhat.com>2022-01-18 17:57:04 -0500
commit2aa184458a11a7ec8c1b451b8eeff458a24632bb (patch)
tree3165fe033d2c22b5a213d31fa3bb2f024979588b
parent7db42268ce4bc77bc13f13ba0899221747255bb5 (diff)
downloadgcc-2aa184458a11a7ec8c1b451b8eeff458a24632bb.zip
gcc-2aa184458a11a7ec8c1b451b8eeff458a24632bb.tar.gz
gcc-2aa184458a11a7ec8c1b451b8eeff458a24632bb.tar.bz2
c++: input_location and lookahead [PR104025]
Debug information was getting confused because input_location was different depending on whether we had looked ahead to see if the next tokens look like a template argument list. I tried resetting input_location in cp_lexer_rollback_tokens itself, but that caused regressions, so let's just do it here for now. PR c++/104025 gcc/cp/ChangeLog: * parser.cc (saved_token_sentinel::rollback): Call cp_lexer_set_source_position. (~saved_token_sentinel): Call rollback. gcc/testsuite/ChangeLog: * g++.dg/warn/pr104025.C: New test. Co-authored-by: Jakub Jelinek <jakub@redhat.com>
-rw-r--r--gcc/cp/parser.cc3
-rw-r--r--gcc/testsuite/g++.dg/warn/pr104025.C20
2 files changed, 22 insertions, 1 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index b262b76..60d9f7b 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -1308,6 +1308,7 @@ struct saved_token_sentinel
void rollback ()
{
cp_lexer_rollback_tokens (lexer);
+ cp_lexer_set_source_position (lexer);
mode = STS_DONOTHING;
}
~saved_token_sentinel ()
@@ -1315,7 +1316,7 @@ struct saved_token_sentinel
if (mode == STS_COMMIT)
cp_lexer_commit_tokens (lexer);
else if (mode == STS_ROLLBACK)
- cp_lexer_rollback_tokens (lexer);
+ rollback ();
gcc_assert (lexer->saved_tokens.length () == len);
}
diff --git a/gcc/testsuite/g++.dg/warn/pr104025.C b/gcc/testsuite/g++.dg/warn/pr104025.C
new file mode 100644
index 0000000..9457c8e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/pr104025.C
@@ -0,0 +1,20 @@
+// PR c++/104025
+// { dg-do compile }
+// { dg-options "-Wmissing-template-keyword -fcompare-debug" }
+
+void bar (int);
+
+struct S { int i; };
+
+template <class C>
+struct T
+{
+ int m;
+ C c;
+ void foo ()
+ {
+ bar (c.i < m);
+ }
+};
+
+template void T<S>::foo ();