blob: 6bfda56e8c6c577600853d861334a1aac6051940 [file] [log] [blame]
// { dg-do run }
#include <stdlib.h>
#include <string>
class Literal;
class CallRuntime;
class AstNode {
public:
enum Type {
kLiteral, kCallRuntime,
kInvalid = -1
};
AstNode() { }
virtual ~AstNode() { }
virtual Type node_type() const = 0;
bool
IsLiteral() { return node_type() == AstNode::kLiteral; }
Literal *
AsLiteral() { return IsLiteral() ? reinterpret_cast<Literal*>(this)
: NULL; }
bool
IsCallRuntime() { return node_type() == AstNode::kCallRuntime; }
CallRuntime *
AsCallRuntime() { return IsCallRuntime() ? reinterpret_cast<CallRuntime*>(this)
: NULL; }
};
class Expression: public AstNode {
public:
private:
int id_;
};
class Literal: public Expression {
public:
virtual AstNode::Type node_type() const { return AstNode::kLiteral; }
private:
std::string ToString();
};
class CallRuntime: public Expression {
public:
virtual AstNode::Type node_type() const { return AstNode::kCallRuntime; }
private:
std::string name_;
};
Expression *
ExpressionCheck (bool *ok)
{
if (*ok == true)
return new CallRuntime();
else
return new Literal ();
return NULL;
}
Expression *
GetExpression (bool *ok)
{
Expression *expression = ExpressionCheck (ok);
Expression *return_expr = NULL;
if (expression != NULL && expression->AsLiteral() != NULL)
return_expr = new Literal();
else if (expression != NULL && expression->AsCallRuntime() != NULL)
return_expr = expression;
return return_expr;
}
int
main (int argc, char **argv)
{
bool a_bool = true;
AstNode *node = GetExpression (&a_bool);
return 0;
}