ch7mon.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /* $Header$ */
  2. /* SEMANTIC ANALYSIS (CHAPTER 7RM) -- MONADIC OPERATORS */
  3. #include "botch_free.h"
  4. #include <alloc.h>
  5. #include "nofloat.h"
  6. #include "nobitfield.h"
  7. #include "Lpars.h"
  8. #include "arith.h"
  9. #include "type.h"
  10. #include "label.h"
  11. #include "expr.h"
  12. #include "idf.h"
  13. #include "def.h"
  14. extern char options[];
  15. extern long full_mask[/*MAXSIZE*/]; /* cstoper.c */
  16. char *symbol2str();
  17. ch7mon(oper, expp)
  18. register struct expr **expp;
  19. {
  20. /* The monadic prefix operator oper is applied to *expp.
  21. */
  22. register struct expr *expr;
  23. switch (oper) {
  24. case '*': /* RM 7.2 */
  25. /* no FIELD type allowed */
  26. if ((*expp)->ex_type->tp_fund == ARRAY)
  27. array2pointer(expp);
  28. if ((*expp)->ex_type->tp_fund != POINTER) {
  29. expr_error(*expp,
  30. "* applied to non-pointer (%s)",
  31. symbol2str((*expp)->ex_type->tp_fund));
  32. }
  33. else {
  34. expr = *expp;
  35. if (expr->ex_lvalue == 0)
  36. /* dereference in administration only */
  37. expr->ex_type = expr->ex_type->tp_up;
  38. else /* runtime code */
  39. *expp = new_oper(expr->ex_type->tp_up, NILEXPR,
  40. '*', expr);
  41. (*expp)->ex_lvalue = (
  42. (*expp)->ex_type->tp_fund != ARRAY &&
  43. (*expp)->ex_type->tp_fund != FUNCTION);
  44. }
  45. break;
  46. case '&':
  47. if ((*expp)->ex_type->tp_fund == ARRAY) {
  48. warning("& before array: ignored");
  49. array2pointer(expp);
  50. }
  51. else
  52. if ((*expp)->ex_type->tp_fund == FUNCTION) {
  53. warning("& before function: ignored");
  54. function2pointer(expp);
  55. }
  56. else
  57. #ifndef NOBITFIELD
  58. if ((*expp)->ex_type->tp_fund == FIELD)
  59. expr_error(*expp, "& applied to field variable");
  60. else
  61. #endif NOBITFIELD
  62. if (!(*expp)->ex_lvalue)
  63. expr_error(*expp, "& applied to non-lvalue");
  64. else {
  65. /* assume that enums are already filtered out */
  66. if ( (*expp)->ex_class == Value
  67. && (*expp)->VL_CLASS == Name
  68. ) {
  69. register struct def *def =
  70. (*expp)->VL_IDF->id_def;
  71. /* &<var> indicates that <var>
  72. cannot be used as register
  73. anymore
  74. */
  75. if (def->df_sc == REGISTER) {
  76. expr_error(*expp,
  77. "& on register variable not allowed");
  78. break; /* break case '&' */
  79. }
  80. def->df_register = REG_NONE;
  81. }
  82. (*expp)->ex_type = pointer_to((*expp)->ex_type);
  83. (*expp)->ex_lvalue = 0;
  84. }
  85. break;
  86. case '~':
  87. #ifndef NOFLOAT
  88. {
  89. int fund = (*expp)->ex_type->tp_fund;
  90. if (fund == FLOAT || fund == DOUBLE) {
  91. expr_error(
  92. *expp,
  93. "~ not allowed on %s operands",
  94. symbol2str(fund)
  95. );
  96. erroneous2int(expp);
  97. break;
  98. }
  99. /* FALLTHROUGH */
  100. }
  101. #endif NOFLOAT
  102. case '-':
  103. any2arith(expp, oper);
  104. if (is_cp_cst(*expp)) {
  105. arith o1 = (*expp)->VL_VALUE;
  106. (*expp)->VL_VALUE = (oper == '-') ? -o1 :
  107. ((*expp)->ex_type->tp_unsigned ?
  108. (~o1) & full_mask[(*expp)->ex_type->tp_size] :
  109. ~o1
  110. );
  111. }
  112. else
  113. #ifndef NOFLOAT
  114. if (is_fp_cst(*expp))
  115. switch_sign_fp(*expp);
  116. else
  117. #endif NOFLOAT
  118. *expp = new_oper((*expp)->ex_type,
  119. NILEXPR, oper, *expp);
  120. break;
  121. case '!':
  122. if ((*expp)->ex_type->tp_fund == FUNCTION)
  123. function2pointer(expp);
  124. if ((*expp)->ex_type->tp_fund != POINTER)
  125. any2arith(expp, oper);
  126. opnd2test(expp, '!');
  127. if (is_cp_cst(*expp)) {
  128. (*expp)->VL_VALUE = !((*expp)->VL_VALUE);
  129. (*expp)->ex_type = int_type; /* a cast ???(EB) */
  130. }
  131. else
  132. *expp = new_oper(int_type, NILEXPR, oper, *expp);
  133. (*expp)->ex_flags |= EX_LOGICAL;
  134. break;
  135. case PLUSPLUS:
  136. case MINMIN:
  137. ch7incr(expp, oper);
  138. break;
  139. case SIZEOF:
  140. if ( (*expp)->ex_class == Value
  141. && (*expp)->VL_CLASS == Name
  142. && (*expp)->VL_IDF->id_def->df_formal_array
  143. )
  144. warning("sizeof formal array %s is sizeof pointer!",
  145. (*expp)->VL_IDF->id_text);
  146. expr = intexpr(size_of_type((*expp)->ex_type, "object"), INT);
  147. expr->ex_flags |= EX_SIZEOF;
  148. free_expression(*expp);
  149. *expp = expr;
  150. break;
  151. }
  152. }