1152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant//===------------------------ private_typeinfo.h --------------------------===//
2152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant//
3152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant//                     The LLVM Compiler Infrastructure
4152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant//
5152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
7152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant//
8152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant//===----------------------------------------------------------------------===//
9152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
10152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant#ifndef __PRIVATE_TYPEINFO_H_
11152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant#define __PRIVATE_TYPEINFO_H_
12152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
13b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool#include "__cxxabi_config.h"
14b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool
15152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant#include <typeinfo>
16f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant#include <cstddef>
17152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
1877a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasoolnamespace __cxxabiv1 {
19facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnant
20b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __shim_type_info : public std::type_info {
21152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
22b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__shim_type_info();
23facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnant
24b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void noop1() const;
25b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void noop2() const;
26b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *thrown_type,
27b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                           void *&adjustedPtr) const = 0;
28facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnant};
29facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnant
30b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __fundamental_type_info : public __shim_type_info {
31facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnantpublic:
32b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__fundamental_type_info();
33b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *,
34b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                           void *&) const;
35152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
36152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
37b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __array_type_info : public __shim_type_info {
38152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
39b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__array_type_info();
40b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *,
41b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                           void *&) const;
42152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
43152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
44b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __function_type_info : public __shim_type_info {
45152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
46b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__function_type_info();
47b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *,
48b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                           void *&) const;
49152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
50152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
51b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __enum_type_info : public __shim_type_info {
52152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
53b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__enum_type_info();
54b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *,
55b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                           void *&) const;
56152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
57152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
58f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnantenum
59f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant{
60f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    unknown = 0,
61f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    public_path,
621309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    not_public_path,
631309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    yes,
641309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    no
65f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant};
66f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant
67b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __class_type_info;
68f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant
6954227aec1d6116c936afa576e2ea36ca3e94b29cShoaib Meenaistruct _LIBCXXABI_HIDDEN __dynamic_cast_info
70f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant{
71cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant// const data supplied to the search:
72f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant
73326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant    const __class_type_info* dst_type;
74326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant    const void* static_ptr;
75326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant    const __class_type_info* static_type;
76326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant    std::ptrdiff_t src2dst_offset;
77f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant
78cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant// Data that represents the answer:
79f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant
80f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    // pointer to a dst_type which has (static_ptr, static_type) above it
81f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    const void* dst_ptr_leading_to_static_ptr;
82f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    // pointer to a dst_type which does not have (static_ptr, static_type) above it
83f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    const void* dst_ptr_not_leading_to_static_ptr;
84cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant
85cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant    // The following three paths are either unknown, public_path or not_public_path.
86f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    // access of path from dst_ptr_leading_to_static_ptr to (static_ptr, static_type)
87f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    int path_dst_ptr_to_static_ptr;
88f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    // access of path from (dynamic_ptr, dynamic_type) to (static_ptr, static_type)
89f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    //    when there is no dst_type along the path
90f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    int path_dynamic_ptr_to_static_ptr;
91f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    // access of path from (dynamic_ptr, dynamic_type) to dst_type
92f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    //    (not used if there is a (static_ptr, static_type) above a dst_type).
93f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    int path_dynamic_ptr_to_dst_ptr;
94cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant
95f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    // Number of dst_types below (static_ptr, static_type)
96f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    int number_to_static_ptr;
97f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    // Number of dst_types not below (static_ptr, static_type)
98f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    int number_to_dst_ptr;
99cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant
100cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant// Data that helps stop the search before the entire tree is searched:
101cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant
102cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant    // is_dst_type_derived_from_static_type is either unknown, yes or no.
1031309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    int is_dst_type_derived_from_static_type;
1041309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    // Number of dst_type in tree.  If 0, then that means unknown.
1051309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    int number_of_dst_type;
106f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    // communicates to a dst_type node that (static_ptr, static_type) was found
107f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant    //    above it.
1081309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    bool found_our_static_ptr;
1091309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    // communicates to a dst_type node that a static_type was found
1101309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    //    above it, but it wasn't (static_ptr, static_type)
1111309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    bool found_any_static_type;
1121309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    // Set whenever a search can be stopped
1131309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant    bool search_done;
114f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant};
115f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant
11616650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant// Has no base class
117b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __class_type_info : public __shim_type_info {
118152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
119b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__class_type_info();
120b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool
121b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN void process_static_type_above_dst(__dynamic_cast_info *,
122b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                       const void *,
123b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                       const void *, int) const;
124b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN void process_static_type_below_dst(__dynamic_cast_info *,
125b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                       const void *, int) const;
126b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN void process_found_base_class(__dynamic_cast_info *, void *,
127b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                  int) const;
128b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *,
129b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                  const void *, const void *,
130b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                  int, bool) const;
131b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void
13277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  search_below_dst(__dynamic_cast_info *, const void *, int, bool) const;
133b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *,
134b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                           void *&) const;
135b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void
13677a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const;
137152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
138152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
13916650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant// Has one non-virtual public base class at offset zero
140b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __si_class_type_info : public __class_type_info {
141152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
14277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  const __class_type_info *__base_type;
143152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
144b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__si_class_type_info();
14516650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant
146b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *,
147b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                  const void *, const void *,
148b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                  int, bool) const;
149b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void
15077a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  search_below_dst(__dynamic_cast_info *, const void *, int, bool) const;
151b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void
15277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const;
153152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
154152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
15554227aec1d6116c936afa576e2ea36ca3e94b29cShoaib Meenaistruct _LIBCXXABI_HIDDEN __base_class_type_info
156152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant{
157152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
158152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant    const __class_type_info* __base_type;
159152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant    long __offset_flags;
160152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
161152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant    enum __offset_flags_masks
162152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant    {
163152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant        __virtual_mask = 0x1,
16416650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant        __public_mask  = 0x2, // base is public
165152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant        __offset_shift = 8
166152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant    };
16716650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant
168326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant    void search_above_dst(__dynamic_cast_info*, const void*, const void*, int, bool) const;
169326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant    void search_below_dst(__dynamic_cast_info*, const void*, int, bool) const;
170a1919d2ee24b06c833493cf06335afa307028bf7Howard Hinnant    void has_unambiguous_public_base(__dynamic_cast_info*, void*, int) const;
171152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
172152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
17316650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant// Has one or more base classes
174b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __vmi_class_type_info : public __class_type_info {
175152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
17677a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  unsigned int __flags;
17777a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  unsigned int __base_count;
17877a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  __base_class_type_info __base_info[1];
17977a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool
18077a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  enum __flags_masks {
18177a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool    __non_diamond_repeat_mask = 0x1, // has two or more distinct base class
18277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool                                     //    objects of the same type
18377a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool    __diamond_shaped_mask = 0x2      // has base class object with two or
18477a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool                                     //    more derived objects
18577a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  };
18677a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool
187b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__vmi_class_type_info();
18877a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool
189b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *,
190b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                  const void *, const void *,
191b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                                  int, bool) const;
192b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void
19377a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  search_below_dst(__dynamic_cast_info *, const void *, int, bool) const;
194b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual void
19577a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const;
196152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
197152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
198b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __pbase_type_info : public __shim_type_info {
199152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
20077a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  unsigned int __flags;
20177a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  const __shim_type_info *__pointee;
20277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool
20377a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  enum __masks {
20477a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool    __const_mask = 0x1,
20577a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool    __volatile_mask = 0x2,
20677a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool    __restrict_mask = 0x4,
20777a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool    __incomplete_mask = 0x8,
208f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    __incomplete_class_mask = 0x10,
209f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    __transaction_safe_mask = 0x20,
210f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    // This implements the following proposal from cxx-abi-dev (not yet part of
211f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    // the ABI document):
212f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    //
213f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    //   http://sourcerytools.com/pipermail/cxx-abi-dev/2016-October/002986.html
214f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    //
215f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    // This is necessary for support of http://wg21.link/p0012, which permits
216f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    // throwing noexcept function and member function pointers and catching
217f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    // them as non-noexcept pointers.
218f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    __noexcept_mask = 0x40,
219f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith
220f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    // Flags that cannot be removed by a standard conversion.
221f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    __no_remove_flags_mask = __const_mask | __volatile_mask | __restrict_mask,
222f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    // Flags that cannot be added by a standard conversion.
223f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith    __no_add_flags_mask = __transaction_safe_mask | __noexcept_mask
22477a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  };
22577a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool
226b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__pbase_type_info();
227b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *,
228b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                           void *&) const;
229152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
230152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
231b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __pointer_type_info : public __pbase_type_info {
232152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
233b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__pointer_type_info();
234b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *,
235b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                           void *&) const;
236b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN bool can_catch_nested(const __shim_type_info *) const;
237152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
238152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
239b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __pointer_to_member_type_info
24077a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool    : public __pbase_type_info {
241152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic:
24277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool  const __class_type_info *__context;
24377a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool
244b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual ~__pointer_to_member_type_info();
245b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *,
246b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool                                           void *&) const;
247b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool  _LIBCXXABI_HIDDEN bool can_catch_nested(const __shim_type_info *) const;
248152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant};
249152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
250152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}  // __cxxabiv1
251152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant
252152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant#endif  // __PRIVATE_TYPEINFO_H_
253