Make alaising a def to a larger type an internal error.

It really doesn't seem wise to allow the compiler to do so as it would
overwrite unrelated defs. The only time such a thing is valid is the return
statement (silly vm design), and that's read-only.
This commit is contained in:
Bill Currie 2012-12-03 11:38:55 +09:00
parent 9ca5a9e86c
commit 9d0332ae30
2 changed files with 3 additions and 4 deletions

View file

@ -117,14 +117,12 @@ def_t *new_def (const char *name, struct type_s *type,
/** Create a def that aliases another def. /** Create a def that aliases another def.
Aliasing a def to the same type is useless, but not checked. Aliasing a Aliasing a def to the same type is useless, but not checked. Aliasing a
def to a type larger than the def's type is a bad idea as another def may def to a type larger than the def's type will generate an internal error.
be overwritten via the alias, but is not checked.
\param def The def to be aliased. \param def The def to be aliased.
\param type The type of the alias. \param type The type of the alias.
\return The def aliasing \a def. \return The def aliasing \a def.
\todo Check for type size?
\todo Make aliasing to the same type a no-op? \todo Make aliasing to the same type a no-op?
*/ */
def_t *alias_def (def_t *def, struct type_s *type); def_t *alias_def (def_t *def, struct type_s *type);

View file

@ -149,13 +149,14 @@ alias_def (def_t *def, type_t *type)
{ {
def_t *alias; def_t *alias;
if (def->alias) { if (def->alias) {
expr_t e; expr_t e;
e.file = def->file; e.file = def->file;
e.line = def->line; e.line = def->line;
internal_error (&e, "aliasing an alias def"); internal_error (&e, "aliasing an alias def");
} }
if (type_size (type) > type_size (def->type))
internal_error (0, "aliasing a def to a larger type");
ALLOC (16384, def_t, defs, alias); ALLOC (16384, def_t, defs, alias);
alias->return_addr = __builtin_return_address (0); alias->return_addr = __builtin_return_address (0);
alias->offset = def->offset; alias->offset = def->offset;