Ignore static members in NoOpStructPrinter

Message ID 20231114140458.2610095-1-tromey@adacore.com
State New
Headers
Series Ignore static members in NoOpStructPrinter |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Testing passed

Commit Message

Tom Tromey Nov. 14, 2023, 2:04 p.m. UTC
  Hannes' patch to show local variables in the TUI pointed out that
NoOpStructPrinter should ignore static members.  This patch implements
this.
---
 gdb/python/lib/gdb/printing.py   |  2 +-
 gdb/testsuite/gdb.dap/ptrref.cc  | 12 ++++++++++++
 gdb/testsuite/gdb.dap/ptrref.exp |  9 ++++++++-
 3 files changed, 21 insertions(+), 2 deletions(-)
  

Patch

diff --git a/gdb/python/lib/gdb/printing.py b/gdb/python/lib/gdb/printing.py
index dec1351c2d7..14bd84b5859 100644
--- a/gdb/python/lib/gdb/printing.py
+++ b/gdb/python/lib/gdb/printing.py
@@ -350,7 +350,7 @@  class NoOpStructPrinter(gdb.ValuePrinter):
 
     def children(self):
         for field in self.__ty.fields():
-            if field.name is not None:
+            if hasattr(field, "bitpos") and field.name is not None:
                 yield (field.name, self.__value[field])
 
 
diff --git a/gdb/testsuite/gdb.dap/ptrref.cc b/gdb/testsuite/gdb.dap/ptrref.cc
index bfb1afe3d17..c9b83cd0612 100644
--- a/gdb/testsuite/gdb.dap/ptrref.cc
+++ b/gdb/testsuite/gdb.dap/ptrref.cc
@@ -15,9 +15,21 @@ 
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+struct some_struct
+{
+  int x;
+  int y;
+
+  static int z;
+};
+
+int some_struct::z = 37;
+
 void
 func ()
 {
+  some_struct aggregate { 91, 87 };
+
   int value = 23;
 
   int *ptr = &value;
diff --git a/gdb/testsuite/gdb.dap/ptrref.exp b/gdb/testsuite/gdb.dap/ptrref.exp
index e0cc74529ab..456774aefbe 100644
--- a/gdb/testsuite/gdb.dap/ptrref.exp
+++ b/gdb/testsuite/gdb.dap/ptrref.exp
@@ -55,7 +55,7 @@  gdb_assert {[llength $scopes] == 2} "two scopes"
 lassign $scopes scope reg_scope
 gdb_assert {[dict get $scope name] == "Locals"} "scope is locals"
 
-gdb_assert {[dict get $scope namedVariables] == 3} "three vars in scope"
+gdb_assert {[dict get $scope namedVariables] == 4} "three vars in scope"
 
 set num [dict get $scope variablesReference]
 set refs [lindex [dap_check_request_and_response "fetch variables" \
@@ -97,6 +97,13 @@  foreach var [dict get $refs body variables] {
 		"$name has exactly one child"
 	    fetch_pointer $name $var
 	}
+	"aggregate" {
+	    gdb_assert {[dict get $var variablesReference] != 0} \
+		"$name has children"
+	    # This should omit the static field.
+	    gdb_assert {[dict get $var namedVariables] == 2} \
+		"$name has exactly 2 children"
+	}
     }
 }