From 2b51fac8f36c672c63dcffa885e709037c754ff3 Mon Sep 17 00:00:00 2001 From: Virgile Prevosto <virgile.prevosto@m4x.org> Date: Fri, 28 May 2021 20:27:22 +0200 Subject: [PATCH] [tests] test new feature --- tests/basic/oracle/underlying_type.res.oracle | 122 ++++++++++++++++++ tests/basic/underlying_type.cpp | 7 + 2 files changed, 129 insertions(+) create mode 100644 tests/basic/oracle/underlying_type.res.oracle create mode 100644 tests/basic/underlying_type.cpp diff --git a/tests/basic/oracle/underlying_type.res.oracle b/tests/basic/oracle/underlying_type.res.oracle new file mode 100644 index 0000000..fb792c5 --- /dev/null +++ b/tests/basic/oracle/underlying_type.res.oracle @@ -0,0 +1,122 @@ +[kernel] Parsing tests/basic/underlying_type.cpp (external front-end) +Now output intermediate result +/* Generated by Frama-C */ +struct _frama_c_vmt_content { + void (*method_ptr)() ; + int shift_this ; +}; +struct _frama_c_rtti_name_info_node; +struct _frama_c_vmt { + struct _frama_c_vmt_content *table ; + int table_size ; + struct _frama_c_rtti_name_info_node *rtti_info ; +}; +struct _frama_c_rtti_name_info_content { + struct _frama_c_rtti_name_info_node *value ; + int shift_object ; + int shift_vmt ; +}; +struct _frama_c_rtti_name_info_node { + char const *name ; + struct _frama_c_rtti_name_info_content *base_classes ; + int number_of_base_classes ; + struct _frama_c_vmt *pvmt ; +}; +typedef _Bool value_type; +struct integral_constant<bool,0>; +struct integral_constant<bool,0> { + +}; +typedef _Bool value_type; +struct integral_constant<bool,1>; +struct integral_constant<bool,1> { + +}; +enum E { + A = 1, + B = 2 +}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +/*@ requires \valid_read(this); */ +value_type value_type)(struct integral_constant<bool,0> const *this); + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "integral_constant", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +/*@ requires \valid_read(this); */ +value_type value_type)(struct integral_constant<bool,1> const *this); + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "integral_constant", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "__boolean", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "__boolean", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "_is_void", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "is_enum", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "ok_type", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "ko_type", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "__underlying_type_t", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; + +struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info = + {.name = "underlying_type", + .base_classes = (struct _frama_c_rtti_name_info_content *)0, + .number_of_base_classes = 0, + .pvmt = (struct _frama_c_vmt *)0}; +int f(void) +{ + int __retres; + __retres = (int)((enum E)A); + return __retres; +} + + diff --git a/tests/basic/underlying_type.cpp b/tests/basic/underlying_type.cpp new file mode 100644 index 0000000..679b844 --- /dev/null +++ b/tests/basic/underlying_type.cpp @@ -0,0 +1,7 @@ +#include <type_traits> + +enum class E : int { A = 1, B = 2 }; + +int f() { + return static_cast<std::underlying_type<E>::type>(E::A); +} -- GitLab