X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=doc%2Fcompiler.sgml;h=131508b9ff3b892e482018641cd70f3a32ad11d0;hb=f601ededaa926a19ca60f95e8bc6f7f0d966f9d1;hp=e66bca33ba61da9496f6b864c1ebb1bb980d3414;hpb=24e6aa49b105bb608c04a4ccdc76fef7b5f838f2;p=sbcl.git diff --git a/doc/compiler.sgml b/doc/compiler.sgml index e66bca3..131508b 100644 --- a/doc/compiler.sgml +++ b/doc/compiler.sgml @@ -376,11 +376,19 @@ types. Ideally, the compiler would consider all type declarations to be assertions, so that adding type declarations to a program, no matter how incorrect they might be, would never cause -undefined behavior. As of &SBCL; version 0.6.4, the compiler is known to +undefined behavior. As of &SBCL; version 0.8.1, the compiler is known to fall short of this goal in two areas: - The compiler trusts function return values which - have been established with proclaim. + Proclaimed constraints on argument and + result types of a function are supposed to be checked by the + function. If the function type is proclaimed before function + definition, type checks are inserted by the compiler, but the + standard allows the reversed order, in which case the compiler + will trust the declaration. + The compiler cannot check types of an unknown number + of values; if the number of generated values is unknown, but the + number of consumed is known, only consumed values are + checked. There are a few poorly characterized but apparently very uncommon situations where a type declaration in an unexpected location will be trusted and never checked by the @@ -439,8 +447,8 @@ an error if it is executed) and gives a warning. Type warnings are inhibited when the -extensions:inhibit-warnings optimization quality is -3. (See the section +sb-ext:inhibit-warnings optimization quality is +3. (See the section on compiler policy.) This can be used in a local declaration to inhibit type warnings in a code fragment that has spurious warnings. @@ -452,31 +460,26 @@ warnings. With the default compilation policy, all type declarations are -precisely checked, except in a few situations (such as using -the to constrain the argument type passed to a function) -where they are simply ignored instead. Precise checking means that the -check is done as though typep had been called with the -exact type specifier that appeared in the declaration. In &SBCL;, -adding type declarations makes code safer. (Except that as noted elsewhere, remaining bugs in -the compiler's handling of types unfortunately provide some exceptions to -this rule.) +precisely checked, except in a few situations where they are simply +ignored instead. Precise checking means that the check is done as +though typep had been called with the exact type +specifier that appeared in the declaration. In &SBCL;, adding type +declarations makes code safer. (Except that as noted elsewhere, remaining bugs +in the compiler's handling of types unfortunately provide some +exceptions to this rule.) If a variable is declared to be -(integer 3 17) -then its -value must always always be an integer between 3 -and 17. -If multiple type declarations apply to a single variable, then all the -declarations must be correct; it is as though all the types were -intersected producing a single and type specifier. - -Argument type declarations are automatically enforced. If you declare -the type of a function argument, a type check will be done when that -function is called. In a function call, the called function does the -argument type checking, which means that a more restrictive type -assertion in the calling function (e.g., from the) may be -lost. +(integer 3 17) then its value must always be an integer +between 3 and 17. If multiple type +declarations apply to a single variable, then all the declarations +must be correct; it is as though all the types were intersected +producing a single and type specifier. + +Argument and result type declarations are automatically +enforced. If you declare the type of a function argument, a type check +will be done when that function is called. In a function call, the +called function does the argument type checking. The types of structure slots are also checked. The value of a structure slot must always be of the type indicated in any