get_canonical_type_for: restore environment better
Commit Message
The method type_base::get_canonical_type_for contains some logic which
temporarily changes a couple of control flags in the type's
environment. It then restores these, but not consistently.
This patch ensures the flags are restored unconditionally.
* src/abg-ir.cc (get_canonical_type_for): Ensure the
do_on_the_fly_canonicalization and
decl_only_class_equals_definition flags are restored
unconditionally.
Signed-off-by: Giuliano Procida <gprocida@google.com>
---
src/abg-ir.cc | 25 +++++++++----------------
1 file changed, 9 insertions(+), 16 deletions(-)
Comments
Giuliano Procida <gprocida@google.com> a écrit:
> The method type_base::get_canonical_type_for contains some logic which
> temporarily changes a couple of control flags in the type's
> environment. It then restores these, but not consistently.
>
> This patch ensures the flags are restored unconditionally.
>
> * src/abg-ir.cc (get_canonical_type_for): Ensure the
> do_on_the_fly_canonicalization and
> decl_only_class_equals_definition flags are restored
> unconditionally.
>
> Signed-off-by: Giuliano Procida <gprocida@google.com>
Applied to master, thanks!
Cheers,
@@ -11912,26 +11912,19 @@ type_base::get_canonical_type_for(type_base_sptr t)
// Compare types by considering that decl-only classes don't
// equal their definition.
env->decl_only_class_equals_definition(false);
- if (types_defined_same_linux_kernel_corpus_public(**it, *t))
- {
- result = *it;
- break;
- }
- if (*it == t)
+ bool equal = types_defined_same_linux_kernel_corpus_public(**it, *t)
+ || *it == t;
+ // Restore the state of the on-the-fly-canonicalization and
+ // the decl-only-class-being-equal-to-a-matching-definition
+ // flags.
+ env->do_on_the_fly_canonicalization(false);
+ env->decl_only_class_equals_definition
+ (saved_decl_only_class_equals_definition);
+ if (equal)
{
- // Restore the state of the on-the-fly-canonicalization
- // and the
- // decl-only-class-being-equal-to-a-matching-definition
- // flags, as we are getting out of the loop.
- env->do_on_the_fly_canonicalization(false);
- env->decl_only_class_equals_definition
- (saved_decl_only_class_equals_definition);
result = *it;
break;
}
- env->do_on_the_fly_canonicalization(false);
- env->decl_only_class_equals_definition
- (saved_decl_only_class_equals_definition);
}
if (!result)
{