bug fixes:

- assignment operators for bit fields were wrong
- some conversions for characters were wrong
- result of assignment operator sometimes had wrong size
- character constant \377 was 255, not -1
- string constant generation was clumsy
This commit is contained in:
ceriel
1987-02-23 13:08:54 +00:00
parent a72685c2b5
commit 6445b23318
5 changed files with 82 additions and 42 deletions

View File

@@ -32,22 +32,35 @@ conversion(from_type, to_type)
if (from_type == to_type) /* a little optimisation */
return;
if (to_size < word_size) to_size = word_size;
switch (fundamental(from_type)) {
case T_SIGNED:
switch (fundamental(to_type)) {
case T_SIGNED:
C_loc(from_size);
C_loc(to_size < word_size ? word_size : to_size);
C_loc(to_size);
C_cii();
break;
case T_UNSIGNED:
C_loc(from_size < word_size ? word_size : from_size);
C_loc(to_size < word_size ? word_size : to_size);
if (from_size < word_size) {
C_loc(from_size);
C_loc(word_size);
C_cii();
from_size = word_size;
}
C_loc(from_size);
C_loc(to_size);
C_ciu();
break;
#ifndef NOFLOAT
case T_FLOATING:
C_loc(from_size < word_size ? word_size : from_size);
if (from_size < word_size) {
C_loc(from_size);
C_loc(word_size);
C_cii();
from_size = word_size;
}
C_loc(from_size);
C_loc(to_size);
C_cif();
break;
@@ -55,8 +68,9 @@ conversion(from_type, to_type)
}
break;
case T_UNSIGNED:
C_loc(from_size < word_size ? word_size : from_size);
C_loc(to_size < word_size ? word_size : to_size);
if (from_size < word_size) from_size = word_size;
C_loc(from_size);
C_loc(to_size);
switch (fundamental(to_type)) {
case T_SIGNED:
C_cui();
@@ -74,7 +88,7 @@ conversion(from_type, to_type)
#ifndef NOFLOAT
case T_FLOATING:
C_loc(from_size);
C_loc(to_size < word_size ? word_size : to_size);
C_loc(to_size);
switch (fundamental(to_type)) {
case T_SIGNED:
C_cfi();