diff --git a/gcc/range-op.cc b/gcc/range-op.cc index ab8f4e211aca288b93c6048b3914740a2c1fc9a1..742e54686b4820d3923058d9c5c070df40cdfc35 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -358,10 +358,8 @@ range_true_and_false (tree type) enum bool_range_state { BRS_FALSE, BRS_TRUE, BRS_EMPTY, BRS_FULL }; -// Return the summary information about boolean range LHS. Return an -// "interesting" range in R. For EMPTY or FULL, return the equivalent -// range for TYPE, for BRS_TRUE and BRS false, return the negation of -// the bool range. +// Return the summary information about boolean range LHS. If EMPTY/FULL, +// return the equivalent range for TYPE in R; if FALSE/TRUE, do nothing. static bool_range_state get_bool_state (irange &r, const irange &lhs, tree val_type) @@ -383,6 +381,7 @@ get_bool_state (irange &r, const irange &lhs, tree val_type) r.set_varying (val_type); return BRS_FULL; } + return BRS_TRUE; } @@ -538,7 +537,7 @@ operator_not_equal::op1_range (irange &r, tree type, break; case BRS_FALSE: - // If its true, the result is the same as OP2. + // If it's false, the result is the same as OP2. r = op2; break; @@ -2643,7 +2642,7 @@ operator_bitwise_xor::op1_range (irange &r, tree type, r = op2; break; default: - gcc_unreachable (); + break; } return true; } diff --git a/gcc/testsuite/gnat.dg/specs/opt5.ads b/gcc/testsuite/gnat.dg/specs/opt5.ads new file mode 100644 index 0000000000000000000000000000000000000000..09b8db54c56586033fbeadfa78fc1a0bb116bb28 --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/opt5.ads @@ -0,0 +1,25 @@ +-- { dg-do compile } +-- { dg-options "-O2 -gnata -gnatVa" } + +with Opt5_Pkg; + +package Opt5 is + + type Object is new Opt5_Pkg.Object with private; + + Undefined : constant Object; + + overriding function Is_Defined (Self : Object) return Boolean; + + function Create (Sloc : Opt5_Pkg.Object) return Integer is (0) + with Pre => Sloc.Is_Defined; + +private + + type Object is new Opt5_Pkg.Object with null record; + + Undefined : constant Object := (Opt5_Pkg.Undefined with others => <>); + + overriding function Is_Defined (Self : Object) return Boolean is (Self /= Undefined); + +end Opt5; diff --git a/gcc/testsuite/gnat.dg/specs/opt5_pkg.ads b/gcc/testsuite/gnat.dg/specs/opt5_pkg.ads new file mode 100644 index 0000000000000000000000000000000000000000..a549f08a72302e84301f41af96224e2b9acf49de --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/opt5_pkg.ads @@ -0,0 +1,17 @@ +package Opt5_Pkg is + + type Object is tagged private; + + Undefined : constant Object; + + function Is_Defined (Self : Object) return Boolean; + +private + + type Object is tagged null record; + + Undefined : constant Object := (others => <>); + + function Is_Defined (Self : Object) return Boolean is (Self /= Undefined); + +end Opt5_Pkg;