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)65 ExpressionCheck (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)76 GetExpression (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)90 main (int argc, char **argv)
91 {
92   bool a_bool = true;
93 
94   AstNode *node = GetExpression (&a_bool);
95 
96   return 0;
97 }
98