aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth/synth-values.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/synth/synth-values.adb')
-rw-r--r--src/synth/synth-values.adb46
1 files changed, 35 insertions, 11 deletions
diff --git a/src/synth/synth-values.adb b/src/synth/synth-values.adb
index bd0fc9f61..7381c9f78 100644
--- a/src/synth/synth-values.adb
+++ b/src/synth/synth-values.adb
@@ -118,32 +118,56 @@ package body Synth.Values is
end case;
end Is_Bounded_Type;
- function Is_Equal (L, R : Value_Acc) return Boolean is
+ function Strip_Alias_Const (V : Value_Acc) return Value_Acc
+ is
+ Res : Value_Acc;
+ begin
+ Res := V;
+ loop
+ case Res.Kind is
+ when Value_Const =>
+ Res := Res.C_Val;
+ when Value_Alias =>
+ if Res.A_Off /= 0 then
+ raise Internal_Error;
+ end if;
+ Res := Res.A_Obj;
+ when others =>
+ return Res;
+ end case;
+ end loop;
+ end Strip_Alias_Const;
+
+ function Is_Equal (L, R : Value_Acc) return Boolean
+ is
+ L1 : constant Value_Acc := Strip_Alias_Const (L);
+ R1 : constant Value_Acc := Strip_Alias_Const (R);
begin
- if L.Kind /= R.Kind then
+ pragma Unreferenced (L, R);
+ if L1.Kind /= R1.Kind then
return False;
end if;
- if L = R then
+ if L1 = R1 then
return True;
end if;
- case L.Kind is
+ case L1.Kind is
when Value_Discrete =>
- return L.Scal = R.Scal;
+ return L1.Scal = R1.Scal;
+ when Value_Float =>
+ return L1.Fp = R1.Fp;
when Value_Const_Array =>
- if L.Arr.Len /= R.Arr.Len then
+ if L1.Arr.Len /= R1.Arr.Len then
return False;
end if;
- for I in L.Arr.V'Range loop
- if not Is_Equal (L.Arr.V (I), R.Arr.V (I)) then
+ for I in L1.Arr.V'Range loop
+ if not Is_Equal (L1.Arr.V (I), R1.Arr.V (I)) then
return False;
end if;
end loop;
return True;
when Value_Const =>
- return Is_Equal (L.C_Val, R.C_Val);
- when Value_Float =>
- return L.Fp = R.Fp;
+ raise Internal_Error;
when others =>
-- TODO.
raise Internal_Error;