summaryrefslogtreecommitdiff
path: root/gcc/type-structural-equality.hpp
blob: b5f1944bd31d6a993e1ba928eac5c2190830871c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#pragma once

#include <set>

class TypeStructuralEquality {
public:
  TypeStructuralEquality() {};
  bool equal(const_tree a, const_tree b);
protected:
  virtual bool _equal(const_tree a, const_tree b);
private:
  typedef std::set<const_tree> tset_t;

  tset_t set_l;
  tset_t set_r;
  bool _equal_code(const_tree a, const_tree b);
  bool _equal_wrapper(const_tree a, const_tree b);

#define TSE_FUNC_DECL(code) \
  virtual bool _walk_ ## code (const_tree l, const_tree r)
  TSE_FUNC_DECL(VOID_TYPE);
  TSE_FUNC_DECL(COMPLEX_TYPE);
  TSE_FUNC_DECL(INTEGER_TYPE);
  TSE_FUNC_DECL(REAL_TYPE);
  TSE_FUNC_DECL(FIXED_POINT_TYPE);
  TSE_FUNC_DECL(POINTER_TYPE);
  TSE_FUNC_DECL(ENUMERAL_TYPE);
  TSE_FUNC_DECL(BOOLEAN_TYPE);
  TSE_FUNC_DECL(OFFSET_TYPE);
  TSE_FUNC_DECL(RECORD_TYPE);
  TSE_FUNC_DECL(REFERENCE_TYPE);
  TSE_FUNC_DECL(ARRAY_TYPE);
  TSE_FUNC_DECL(UNION_TYPE);
  TSE_FUNC_DECL(FUNCTION_TYPE);
  TSE_FUNC_DECL(METHOD_TYPE);

  const_tree left;
};