https://gcc.gnu.org/g:005f7176e0f457a1e1a7398ddcb4a4972da28c62

commit r15-3642-g005f7176e0f457a1e1a7398ddcb4a4972da28c62
Author: Simon Martin <si...@nasilyan.com>
Date:   Fri Sep 13 16:40:22 2024 +0200

    c++: Don't mix timevar_start and auto_cond_timevar for TV_NAME_LOOKUP 
[PR116681]
    
    We currently ICE upon the following testcase when using -ftime-report
    
    === cut here ===
    template < int> using __conditional_t = int;
    template < typename _Iter >
    concept random_access_iterator = requires { new _Iter; };
    template < typename _Iterator >
    struct reverse_iterator {
      using iterator_concept =
        __conditional_t< random_access_iterator< _Iterator>>;
    };
    void RemoveBottom() {
      int iter;
      for (reverse_iterator< int > iter;;)
          ;
    }
    === cut here ===
    
    The problem is that qualified_namespace_lookup does a plain start() of
    the TV_NAME_LOOKUP timer (that asserts that the timer is not already
    started). However this timer has already been cond_start()'d in the call
    stack - by pushdecl - so the assert fails.
    
    This patch simply ensures that we always conditionally start this timer
    (which is done in all other places that use it).
    
            PR c++/116681
    
    gcc/cp/ChangeLog:
    
            * name-lookup.cc (qualified_namespace_lookup): Use an
            auto_cond_timer instead of using timevar_start and timevar_stop.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/concepts-pr116681.C: New test.

Diff:
---
 gcc/cp/name-lookup.cc                          |  3 +--
 gcc/testsuite/g++.dg/cpp2a/concepts-pr116681.C | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
index bfe17b7cb2fc..c7a693e02d59 100644
--- a/gcc/cp/name-lookup.cc
+++ b/gcc/cp/name-lookup.cc
@@ -7421,10 +7421,9 @@ tree lookup_qualified_name (tree t, const char *p, 
LOOK_want w, bool c)
 static bool
 qualified_namespace_lookup (tree scope, name_lookup *lookup)
 {
-  timevar_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   query_oracle (lookup->name);
   bool found = lookup->search_qualified (ORIGINAL_NAMESPACE (scope));
-  timevar_stop (TV_NAME_LOOKUP);
   return found;
 }
 
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-pr116681.C 
b/gcc/testsuite/g++.dg/cpp2a/concepts-pr116681.C
new file mode 100644
index 000000000000..f1b47797f1ed
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-pr116681.C
@@ -0,0 +1,20 @@
+// PR c++/116681
+// { dg-do compile { target c++20 } }
+// { dg-additional-options "-ftime-report" }
+// { dg-allow-blank-lines-in-output 1 }
+// { dg-prune-output "Time variable" }
+// { dg-prune-output "k" }
+// { dg-prune-output "\[0-9\]+%" }
+
+template < int> using __conditional_t = int;
+template < typename _Iter >
+concept random_access_iterator = requires { new _Iter; };
+template < typename _Iterator > struct reverse_iterator {
+  using iterator_concept = __conditional_t< random_access_iterator< _Iterator 
>>;
+};
+void RemoveBottom()
+{
+  int iter;
+  for (reverse_iterator< int > iter;;)
+      ;
+}

Reply via email to