ch7mon.c 3.6 KB

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