label.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. * See the copyright notice in the ACK home directory, in the file "Copyright".
  4. */
  5. /* $Id$ */
  6. /* L A B E L H A N D L I N G */
  7. #include "Lpars.h"
  8. #include "level.h"
  9. #include "idf.h"
  10. #include "label.h"
  11. #include "arith.h"
  12. #include "def.h"
  13. #include "type.h"
  14. #include "noRoption.h"
  15. extern char options[];
  16. enter_label(idf, defining)
  17. register struct idf *idf;
  18. {
  19. /* The identifier idf is entered as a label. If it is new,
  20. it is entered into the idf list with the largest possible
  21. scope, i.e., on the lowest possible level.
  22. If defining, the label comes from a label statement.
  23. */
  24. if (idf->id_def) {
  25. register struct def *def = idf->id_def;
  26. if (def->df_sc == LABEL) {
  27. if (defining && def->df_initialized)
  28. error("redeclaration of label %s",
  29. idf->id_text);
  30. }
  31. else { /* there may still be room for it */
  32. #ifndef NOROPTION
  33. if (options['R'] && def->df_sc == TYPEDEF)
  34. warning("label %s is also a typedef",
  35. idf->id_text);
  36. #endif
  37. if (def->df_level == level) /* but alas, no */
  38. error("%s is not a label", idf->id_text);
  39. else {
  40. register int lvl = def->df_level + 1;
  41. #ifndef NOROPTION
  42. if (options['R'] && def->df_level > L_LOCAL)
  43. warning("label %s is not function-wide",
  44. idf->id_text);
  45. #endif
  46. if (lvl < L_LOCAL)
  47. lvl = L_LOCAL;
  48. add_def(idf, LABEL, label_type, lvl);
  49. }
  50. }
  51. }
  52. else {
  53. add_def(idf, LABEL, label_type, L_LOCAL);
  54. }
  55. if (idf->id_def->df_address == 0)
  56. idf->id_def->df_address = (arith) text_label();
  57. if (defining)
  58. idf->id_def->df_initialized = 1;
  59. }
  60. unstack_label(idf)
  61. register struct idf *idf;
  62. {
  63. /* The scope in which the label idf occurred is left.
  64. */
  65. if (!idf->id_def->df_initialized && !is_anon_idf(idf))
  66. error("label %s not defined", idf->id_text);
  67. }