ref: 0214edbad28232ca828f44aa43dd413fe18edaa9
dir: /stmt.c/
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include "cc1.h"
Symbol *curfun;
extern Node *convert(Node *np, Type *tp1, char iscast);
static void stmt(Symbol *lbreak, Symbol *lcont, Symbol *lswitch);
static Node *
stmtexp(void)
{
Node *np = expr();
expect(';');
return np;
}
static void
Return(void)
{
Node *np;
Type *tp = curfun->type->type;
expect(RETURN);
np = stmtexp();
if (np->type != tp) {
if (tp == voidtype)
warn(1, "function returning void returns a value");
else if ((np = convert(np, tp, 0)) == NULL)
error("incorrect type in return");
}
emitret(tp);
emitexp(np);
}
void
compound(Symbol *lbreak, Symbol *lcont, Symbol *lswitch)
{
expect('{');
for (;;) {
switch (yytoken) {
case '}':
next();
return;
case '{':
compound(lbreak, lcont, lswitch);
break;
case TYPE: case SCLASS: case TQUALIFIER:
decl();
break;
default:
stmt(lbreak, lcont, lswitch);
}
}
}
static void
stmt(Symbol *lbreak, Symbol *lcont, Symbol *lswitch)
{
switch (yytoken) {
case '{': compound(lbreak, lcont, lswitch); break;
case RETURN: Return(); break;
default: emitexp(stmtexp()); break;
}
}