c++: Fix thinko in enum_min_precision [PR61414]
When backporting the PR61414 fix to 8.4, I've noticed that the caching of prec is actually broken, as it would fail to actually store the computed precision into the hash_map's value and so next time we'd think the enum needs 0 bits. 2020-02-14 Jakub Jelinek <jakub@redhat.com> PR c++/61414 * class.c (enum_min_precision): Change prec type from int to int &. * g++.dg/cpp0x/enum39.C: New test.
This commit is contained in:
parent
0f7b7aeb71
commit
f0a72494ea
|
@ -1,3 +1,8 @@
|
|||
2020-02-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/61414
|
||||
* class.c (enum_min_precision): Change prec type from int to int &.
|
||||
|
||||
2020-02-13 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
Backported from mainline
|
||||
|
|
|
@ -3219,7 +3219,7 @@ enum_min_precision (tree type)
|
|||
enum_to_min_precision = hash_map<tree, int>::create_ggc (37);
|
||||
|
||||
bool existed;
|
||||
int prec = enum_to_min_precision->get_or_insert (type, &existed);
|
||||
int &prec = enum_to_min_precision->get_or_insert (type, &existed);
|
||||
if (existed)
|
||||
return prec;
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2020-02-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/61414
|
||||
* g++.dg/cpp0x/enum39.C: New test.
|
||||
|
||||
2020-02-14 Richard Biener <rguenther@suse.de>
|
||||
|
||||
Backport from mainline
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
// PR c++/61414
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
enum class E { E0 = -4, E1 = 3 };
|
||||
enum F : unsigned { F0 = 0, F1 = 15 };
|
||||
|
||||
struct S
|
||||
{
|
||||
E a : 2; // { dg-warning "'S::a' is too small to hold all values of 'enum class E'" }
|
||||
E b : 2; // { dg-warning "'S::b' is too small to hold all values of 'enum class E'" }
|
||||
E c : 3; // { dg-bogus "'S::c' is too small to hold all values of 'enum class E'" }
|
||||
F d : 3; // { dg-warning "'S::d' is too small to hold all values of 'enum F'" }
|
||||
F e : 3; // { dg-warning "'S::e' is too small to hold all values of 'enum F'" }
|
||||
F f : 4; // { dg-bogus "'S::f' is too small to hold all values of 'enum F'" }
|
||||
};
|
Loading…
Reference in New Issue