To Raise or Not To Raise?

Christoph Karl Walter Grein

Ein Compiler, kluges Köpfchen, das er ist, optimiert folgenden if-Block weg:

denn Label ist als Sieben-Bit-Integer

deklariert worden, natürlich versehentlich, es war eine sieben Bit lange vorzeichenlose Zahl gemeint. Der Compiler schließt nämlich messerscharf, dass 64 nicht zum Wertebereich von Label gehört, daher die Bedingung auch nie eintreten kann!

Als dieses Problem bei uns auftrat, war die Aufregung groß – und die allgemeine Meinung, dies sei ein Compiler-Fehler. Mitnichten!

Warum bloß löst der implizit deklarierte Gleichheitsoperator im Ausdruck Label = 64 keine Aus-nahme (Constraint_Error) aus, wie das bei einem Funktionsauf Equal (Label, 64) mit selbstdefinierter Funktion

doch prompt geschieht?

Die vorzeichenlose Sieben-Bit-Zahl wurde dann übrigens als

deklariert 1, in wunderbarer Übereinstimmung mit der Namenskonvention, dass Natural ein Untertyp von Integer ist, und somit ein nachahmenswertes Beispiel, wie man scheinbar Offensichtliches verdrehen kann.

Lösung


1 Das ist natürlich Ada83. In Ada95 würde man das heute anders definieren, doch in der überholten Sprachversion gab es keine vorzeichenlose Typen.