public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/aoliva/heads/testme)] c++: set loc on call even if result is discarded
@ 2022-04-07 23:08 Alexandre Oliva
  0 siblings, 0 replies; only message in thread
From: Alexandre Oliva @ 2022-04-07 23:08 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:010f074386f66370a9de6dd49d33e20da991cf7a

commit 010f074386f66370a9de6dd49d33e20da991cf7a
Author: Alexandre Oliva <oliva@adacore.com>
Date:   Wed Apr 6 15:20:43 2022 -0300

    c++: set loc on call even if result is discarded
    
    This patch fixes a divergence in line numbers in diagnostics and,
    presumably, debug information, between targets whose cdtors return
    this and those that don't.
    
    The problem was visible in g++.dg/cpp2a/constexpr-dtor3.C: while the
    dtor call in the cleanup for f4 was expected at the closing brace, on
    returning-this targets it came up at the assignment.
    
    The reason is convoluted: statements in cleanups have their location
    information removed, to avoid bumpy debugger behavior, and then set to
    the location of the end of the scope.
    
    The cleanup dtor call has its locus cleared in both kinds of targets,
    but the end-of-scope locus doesn't make it on returning-this targets.
    The calls are wrapped with a cast-to-void to discard the unused return
    value, and the existing logic only attached the locus to the
    conversion NOP_EXPR.
    
    The call thus remains locus-less.  When constexpr logic copies and
    evals the body, it sets unset locations; while copying cleanups, the
    locus is taken from the cleanup expression, rather than matching the
    end-of-scope locus set by the parser.  So we end up with different
    locations.
    
    This patch sets the locus of the call even when it's wrapped by a
    convert-to-void NOP_EXPR, so it won't diverge any more.
    
    
    for  gcc/cp/ChangeLog
    
            * semantics.cc (set_cleanup_locs): Propagate locus to call
            wrapped in cast-to-void.

Diff:
---
 gcc/cp/semantics.cc | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
index a7f6449dafd..43627ed30af 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -609,7 +609,17 @@ set_cleanup_locs (tree stmts, location_t loc)
 {
   if (TREE_CODE (stmts) == CLEANUP_STMT)
     {
-      protected_set_expr_location (CLEANUP_EXPR (stmts), loc);
+      tree t = CLEANUP_EXPR (stmts);
+      protected_set_expr_location (t, loc);
+      /* Avoid locus differences for C++ cdtor calls depending on whether
+	 cdtor_returns_this: a conversion to void is added to discard the return
+	 value, and this conversion ends up carrying the location, and when it
+	 gets discarded, the location is lost.  So hold it in the call as
+	 well.  */
+      if (TREE_CODE (t) == NOP_EXPR
+	  && TREE_TYPE (t) == void_type_node
+	  && TREE_CODE (TREE_OPERAND (t, 0)) == CALL_EXPR)
+	protected_set_expr_location (TREE_OPERAND (t, 0), loc);
       set_cleanup_locs (CLEANUP_BODY (stmts), loc);
     }
   else if (TREE_CODE (stmts) == STATEMENT_LIST)


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-04-07 23:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-07 23:08 [gcc(refs/users/aoliva/heads/testme)] c++: set loc on call even if result is discarded Alexandre Oliva

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).