From 6e0b048fb5bc0809048ef8f487830ad26f4b87cf Mon Sep 17 00:00:00 2001 From: anetczuk <anetczuk@o2.pl> Date: Tue, 14 Jan 2025 20:35:44 +0100 Subject: [PATCH] c++: dump-lang-raw with obj_type_ref fields Raw dump of lang tree was missing information about virtual method call. The information is provided in "tok" field of obj_type_ref. gcc/ChangeLog: * tree-dump.cc (dequeue_and_dump): Handle OBJ_TYPE_REF. gcc/testsuite/ChangeLog: * g++.dg/diagnostic/lang-dump-1.C: New test. --- gcc/testsuite/g++.dg/diagnostic/lang-dump-1.C | 22 +++++++++++++++++++ gcc/tree-dump.cc | 7 ++++++ 2 files changed, 29 insertions(+) create mode 100644 gcc/testsuite/g++.dg/diagnostic/lang-dump-1.C diff --git a/gcc/testsuite/g++.dg/diagnostic/lang-dump-1.C b/gcc/testsuite/g++.dg/diagnostic/lang-dump-1.C new file mode 100644 index 000000000000..41768949f12f --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/lang-dump-1.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// { dg-additional-options "-fdump-lang-raw" } +// Check if dump file contains OBJ_TYPE_REF with additional fields (information about called virtual method). + +class VExample { +public: + virtual void methodV1() {} + virtual void methodV2() {} +}; + +void funcA() { + VExample objA; + VExample *ptrA = &objA; + + ptrA->methodV2(); + ptrA->methodV1(); +} + +// { dg-final { scan-lang-dump-times {obj_type_ref[^\n]*type:} 2 raw } } +// { dg-final { scan-lang-dump-times {obj_type_ref[^\n]*expr:} 2 raw } } +// { dg-final { scan-lang-dump-times {obj_type_ref[^\n]*obj :} 2 raw } } +// { dg-final { scan-lang-dump-times {obj_type_ref[^\n]*\n[^\n]*tok :} 2 raw } } diff --git a/gcc/tree-dump.cc b/gcc/tree-dump.cc index c234d1ccaf37..bec36b41ea57 100644 --- a/gcc/tree-dump.cc +++ b/gcc/tree-dump.cc @@ -697,6 +697,13 @@ dequeue_and_dump (dump_info_p di) dump_child ("op: ", OMP_CLAUSE_OPERAND (t, i)); } break; + + case OBJ_TYPE_REF: + dump_child ("expr", OBJ_TYPE_REF_EXPR (t)); + dump_child ("obj", OBJ_TYPE_REF_OBJECT (t)); + dump_child ("tok", OBJ_TYPE_REF_TOKEN (t)); + break; + default: /* There are no additional fields to print. */ break; -- GitLab