23
23
// / \return true if \a base is of type \a T
24
24
template <typename T> bool check_expr_type (const exprt &base);
25
25
26
- template <typename T> struct remove_constt ;
27
- template <typename T> struct remove_constt <const T> { using type=T; };
28
- template <typename T> struct ptr_typet ;
29
- template <typename T> struct ptr_typet <T *> { using type=T; };
30
- template <typename T> struct ref_typet ;
31
- template <typename T> struct ref_typet <T &> { using type=T; };
32
-
33
26
34
27
// / \brief Cast a constant pointer to a generic exprt to a specific derived
35
28
// / class
@@ -42,7 +35,7 @@ T expr_dynamic_cast(const exprt *base)
42
35
{
43
36
return expr_dynamic_cast<
44
37
T,
45
- typename remove_constt <typename ptr_typet <T>::type>::type,
38
+ typename std::remove_const <typename std::remove_pointer <T>::type>::type,
46
39
const exprt>(base);
47
40
}
48
41
@@ -54,7 +47,10 @@ T expr_dynamic_cast(const exprt *base)
54
47
template <typename T>
55
48
T expr_dynamic_cast (exprt *base)
56
49
{
57
- return expr_dynamic_cast<T, typename ptr_typet<T>::type, exprt>(base);
50
+ return expr_dynamic_cast<
51
+ T,
52
+ typename std::remove_const<typename std::remove_pointer<T>::type>::type,
53
+ exprt>(base);
58
54
}
59
55
60
56
// / \brief Cast a pointer to a generic exprt to a specific derived class
@@ -66,6 +62,9 @@ T expr_dynamic_cast(exprt *base)
66
62
template <typename T, typename TUnderlying, typename TExpr>
67
63
T expr_dynamic_cast (TExpr *base)
68
64
{
65
+ static_assert (
66
+ std::is_pointer<T>::value,
67
+ " Tried to convert exprt * to non-pointer type" );
69
68
static_assert (
70
69
std::is_base_of<exprt, TUnderlying>::value,
71
70
" The template argument T must be derived from exprt." );
@@ -89,7 +88,7 @@ T expr_dynamic_cast(const exprt &base)
89
88
{
90
89
return expr_dynamic_cast<
91
90
T,
92
- typename remove_constt <typename ref_typet <T>::type>::type,
91
+ typename std::remove_const <typename std::remove_reference <T>::type>::type,
93
92
const exprt>(base);
94
93
}
95
94
@@ -101,7 +100,10 @@ T expr_dynamic_cast(const exprt &base)
101
100
template <typename T>
102
101
T expr_dynamic_cast (exprt &base)
103
102
{
104
- return expr_dynamic_cast<T, typename ref_typet<T>::type, exprt>(base);
103
+ return expr_dynamic_cast<
104
+ T,
105
+ typename std::remove_const<typename std::remove_reference<T>::type>::type,
106
+ exprt>(base);
105
107
}
106
108
107
109
// / \brief Cast a reference to a generic exprt to a specific derived class
@@ -113,6 +115,9 @@ T expr_dynamic_cast(exprt &base)
113
115
template <typename T, typename TUnderlying, typename TExpr>
114
116
T expr_dynamic_cast (TExpr &base)
115
117
{
118
+ static_assert (
119
+ std::is_reference<T>::value,
120
+ " Tried to convert exprt & to non-reference type" );
116
121
static_assert (
117
122
std::is_base_of<exprt, TUnderlying>::value,
118
123
" The template argument T must be derived from exprt." );
0 commit comments