old-cross-binutils/gdb/testsuite/gdb.python/py-pp-maint.c
Simon Marchi 5f5dfff63f Fix sorting of enum values in FlagEnumerationPrinter
The lambda function used to sort the enumerator list does not work
properly.  This list consists of tuples, (enum label, enum value).  The
key function returns x.enumval.  enumval not being defined for a tuple,
we see this exception in the test log:

  Python Exception <class 'AttributeError'> 'tuple' object has no attribute 'enumval'

The function should return the second item of the tuple, which is the
enumval.

The pretty-printer still worked mostly correctly, except that the
enumeration values were not sorted.  The test still passed because the
enumeration values are already sorted where they are defined.  The test
also passed despite the exception being printed, because the right output
was printed after the exception:

  print (enum flag_enum) (FLAG_1)
  Python Exception <type 'exceptions.AttributeError'> 'tuple' objecthas no attribute 'enumval':M
  $7 = 0x1 [FLAG_1]
  (gdb) PASS: gdb.python/py-pp-maint.exp: print FLAG_1

New in v2:

- Improved test case, I stole Pedro's example directly.  It verifies
  that the sorting of enumerators by value works, by checking that
  printing FOO_MASK appears as FOO_1 | FOO_2 | FOO_3.

  I noticed that I could change the regexps to almost anything and the
  tests would still pass.  I think it was because of the | in there.  I
  made them more robust by using string_to_regexp.  I used curly braces
  { } instead of quoting marks " " for strings, so that I could use
  square brackets [ ] in them without having to escape them all.  I also
  removed the "message" part of the tests, since they are redundant with
  the command, and it's just more maintenance to have to update them.

  Tested with Python 2.7 and 3.5.

gdb/ChangeLog:

	* python/lib/gdb/printing.py (FlagEnumerationPrinter.__call__):
	Fix enumerators sort key function.

gdb/testsuite/ChangeLog:

	* gdb.python/py-pp-maint.exp: Change/add enum flag tests.
	* gdb.python/py-pp-maint.c (enum flag_enum): Use more complex
	enum flag values.
2016-01-20 13:44:33 -05:00

86 lines
1.6 KiB
C

/* This testcase is part of GDB, the GNU debugger.
Copyright 2010-2016 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <string.h>
enum flag_enum
{
/* Define the enumeration values in an unsorted manner to verify that we
effectively sort them by value. */
FOO_MASK = 0x07,
FOO_1 = 0x01,
FOO_2 = 0x02,
FOO_3 = 0x04,
BAR_MASK = 0x70,
BAR_1 = 0x10,
BAR_2 = 0x20,
BAR_3 = 0x40,
};
enum flag_enum fval;
struct function_lookup_test
{
int x,y;
};
void
init_flt (struct function_lookup_test *p, int x, int y)
{
p->x = x;
p->y = y;
}
struct s
{
int a;
int *b;
};
struct ss
{
struct s a;
struct s b;
};
void
init_s (struct s *s, int a)
{
s->a = a;
s->b = &s->a;
}
void
init_ss (struct ss *s, int a, int b)
{
init_s (&s->a, a);
init_s (&s->b, b);
}
int
main ()
{
struct function_lookup_test flt;
struct ss ss;
init_flt (&flt, 42, 43);
init_ss (&ss, 1, 2);
return 0; /* break to inspect */
}