From: anetczuk Date: Tue, 14 Jan 2025 19:35:44 +0000 (+0100) Subject: c++: dump-lang-raw with obj_type_ref fields X-Git-Tag: basepoints/gcc-16~2653 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6e0b048fb5bc0809048ef8f487830ad26f4b87cf;p=thirdparty%2Fgcc.git 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. --- 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;