// { dg-do run } #include #include 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(this) : NULL; } bool IsCallRuntime() { return node_type() == AstNode::kCallRuntime; } CallRuntime * AsCallRuntime() { return IsCallRuntime() ? reinterpret_cast(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; }