1 // { dg-do run } 2 3 #include <stdlib.h> 4 #include <string> 5 6 class Literal; 7 class CallRuntime; 8 9 class AstNode { 10 public: 11 12 enum Type { 13 kLiteral, kCallRuntime, 14 kInvalid = -1 15 }; 16 AstNode()17 AstNode() { } 18 ~AstNode()19 virtual ~AstNode() { } 20 21 virtual Type node_type() const = 0; 22 23 bool IsLiteral()24 IsLiteral() { return node_type() == AstNode::kLiteral; } 25 26 Literal * AsLiteral()27 AsLiteral() { return IsLiteral() ? reinterpret_cast<Literal*>(this) 28 : NULL; } 29 30 bool IsCallRuntime()31 IsCallRuntime() { return node_type() == AstNode::kCallRuntime; } 32 33 CallRuntime * AsCallRuntime()34 AsCallRuntime() { return IsCallRuntime() ? reinterpret_cast<CallRuntime*>(this) 35 : NULL; } 36 37 }; 38 39 class Expression: public AstNode { 40 public: 41 private: 42 int id_; 43 }; 44 45 class Literal: public Expression { 46 public: 47 node_type() const48 virtual AstNode::Type node_type() const { return AstNode::kLiteral; } 49 50 private: 51 std::string ToString(); 52 53 }; 54 55 class CallRuntime: public Expression { 56 public: 57 node_type() const58 virtual AstNode::Type node_type() const { return AstNode::kCallRuntime; } 59 60 private: 61 std::string name_; 62 }; 63 64 Expression * ExpressionCheck(bool * ok)65ExpressionCheck (bool *ok) 66 { 67 if (*ok == true) 68 return new CallRuntime(); 69 else 70 return new Literal (); 71 72 return NULL; 73 } 74 75 Expression * GetExpression(bool * ok)76GetExpression (bool *ok) 77 { 78 Expression *expression = ExpressionCheck (ok); 79 Expression *return_expr = NULL; 80 81 if (expression != NULL && expression->AsLiteral() != NULL) 82 return_expr = new Literal(); 83 else if (expression != NULL && expression->AsCallRuntime() != NULL) 84 return_expr = expression; 85 86 return return_expr; 87 } 88 89 int main(int argc,char ** argv)90main (int argc, char **argv) 91 { 92 bool a_bool = true; 93 94 AstNode *node = GetExpression (&a_bool); 95 96 return 0; 97 } 98