view dmd/StaticIfCondition.d @ 0:10317f0c89a5

Initial commit
author korDen
date Sat, 24 Oct 2009 08:42:06 +0400
parents
children 1628b221808d
line wrap: on
line source

module dmd.StaticIfCondition;

import dmd.Expression;
import dmd.ScopeDsymbol;
import dmd.OutBuffer;
import dmd.Loc;
import dmd.Scope;
import dmd.Condition;
import dmd.HdrGenState;
import dmd.WANT;
import dmd.Util;

class StaticIfCondition : Condition
{
	Expression exp;

	this(Loc loc, Expression exp)
	{
		super(loc);
		this.exp = exp;
	}

	Condition syntaxCopy()
	{
		assert(false);
	}

	bool include(Scope sc, ScopeDsymbol s)
	{
	static if (false) {
		printf("StaticIfCondition.include(sc = %p, s = %p)\n", sc, s);
		if (s)
		{
			printf("\ts = '%s', kind = %s\n", s.toChars(), s.kind());
		}
	}
		if (inc == 0)
		{
			if (!sc)
			{
				error(loc, "static if conditional cannot be at global scope");
				inc = 2;
				return 0;
			}

			sc = sc.push(sc.scopesym);
			sc.sd = s;			// s gets any addMember()
			sc.flags |= SCOPE.SCOPEstaticif;
			Expression e = exp.semantic(sc);
			sc.pop();
			e = e.optimize(WANTvalue | WANTinterpret);
			if (e.isBool(true))
				inc = 1;
			else if (e.isBool(false))
				inc = 2;
			else
			{
				e.error("expression %s is not constant or does not evaluate to a bool", e.toChars());
				inc = 2;
			}
		}
		return (inc == 1);
	}

	void toCBuffer(OutBuffer buf, HdrGenState* hgs)
	{
		assert(false);
	}
}