ch7mon.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. char *symbol2str();
  15. ch7mon(oper, expp)
  16. register struct expr **expp;
  17. {
  18. /* The monadic prefix operator oper is applied to *expp.
  19. */
  20. register struct expr *expr;
  21. switch (oper) {
  22. case '*': /* RM 7.2 */
  23. /* no FIELD type allowed */
  24. if ((*expp)->ex_type->tp_fund == ARRAY)
  25. array2pointer(expp);
  26. if ((*expp)->ex_type->tp_fund != POINTER) {
  27. if ((*expp)->ex_type != error_type)
  28. error("* applied to non-pointer (%s)",
  29. symbol2str((*expp)->ex_type->tp_fund));
  30. (*expp)->ex_type = error_type;
  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. array2pointer(expp);
  48. }
  49. else
  50. if ((*expp)->ex_type->tp_fund == FUNCTION) {
  51. function2pointer(expp);
  52. }
  53. else
  54. #ifndef NOBITFIELD
  55. if ((*expp)->ex_type->tp_fund == FIELD) {
  56. error("& applied to field variable");
  57. (*expp)->ex_type = error_type;
  58. }
  59. else
  60. #endif NOBITFIELD
  61. if (!(*expp)->ex_lvalue) {
  62. error("& applied to non-lvalue");
  63. (*expp)->ex_type = error_type;
  64. }
  65. else {
  66. /* assume that enums are already filtered out */
  67. if ((*expp)->ex_class == Value && (*expp)->VL_IDF) {
  68. register struct def *def =
  69. (*expp)->VL_IDF->id_def;
  70. /* &<var> indicates that <var> cannot
  71. be used as register anymore
  72. */
  73. if (def->df_sc == REGISTER) {
  74. error("'&' on register variable not allowed");
  75. (*expp)->ex_type = error_type;
  76. break; /* break case '&' */
  77. }
  78. def->df_register = REG_NONE;
  79. }
  80. (*expp)->ex_type = pointer_to((*expp)->ex_type);
  81. (*expp)->ex_lvalue = 0;
  82. }
  83. break;
  84. case '~':
  85. {
  86. int fund = (*expp)->ex_type->tp_fund;
  87. if (fund == FLOAT || fund == DOUBLE) {
  88. error("~ not allowed on %s operands", symbol2str(fund));
  89. *expp = intexpr((arith)1, INT);
  90. break;
  91. }
  92. }
  93. case '-':
  94. any2arith(expp, oper);
  95. if (is_cp_cst(*expp)) {
  96. arith o1 = (*expp)->VL_VALUE;
  97. if (oper == '-')
  98. o1 = -o1;
  99. else
  100. o1 = ~o1;
  101. (*expp)->VL_VALUE = o1;
  102. }
  103. else
  104. if (is_fp_cst(*expp))
  105. switch_sign_fp(*expp);
  106. else
  107. *expp = new_oper((*expp)->ex_type, NILEXPR, oper, *expp);
  108. break;
  109. case '!':
  110. if ((*expp)->ex_type->tp_fund == FUNCTION)
  111. function2pointer(expp);
  112. if ((*expp)->ex_type->tp_fund != POINTER)
  113. any2arith(expp, oper);
  114. opnd2test(expp, '!');
  115. if (is_cp_cst(*expp)) {
  116. arith o1 = (*expp)->VL_VALUE;
  117. o1 = !o1;
  118. (*expp)->VL_VALUE = o1;
  119. (*expp)->ex_type = int_type;
  120. }
  121. else
  122. *expp = new_oper(int_type, NILEXPR, oper, *expp);
  123. (*expp)->ex_flags |= EX_LOGICAL;
  124. break;
  125. case PLUSPLUS:
  126. case MINMIN:
  127. ch7incr(expp, oper);
  128. break;
  129. case SIZEOF:
  130. if ( (*expp)->ex_class == Value
  131. && (*expp)->VL_IDF
  132. && (*expp)->VL_IDF->id_def->df_formal_array
  133. )
  134. warning("sizeof formal array %s is sizeof pointer!",
  135. (*expp)->VL_IDF->id_text);
  136. expr = intexpr(size_of_type((*expp)->ex_type, "object"), INT);
  137. free_expression(*expp);
  138. *expp = expr;
  139. (*expp)->ex_flags |= EX_SIZEOF;
  140. break;
  141. }
  142. }