Skip to content

Commit 5e98d8a

Browse files
committed
Assert on unhandled types
1 parent 002d013 commit 5e98d8a

1 file changed

Lines changed: 26 additions & 15 deletions

File tree

‎cpp2rust/converter/rules/rules_loader.cpp‎

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -155,17 +155,22 @@ class RuleUsageCollector
155155
return;
156156
}
157157
AddKey(TypeKey(type));
158-
if (const auto *enum_decl = type->getAsEnumDecl()) {
159-
AddType(enum_decl->getIntegerType());
158+
if (auto desugared = type.getSingleStepDesugaredType(ctx_);
159+
desugared != type) {
160+
if (const auto *spec = llvm::dyn_cast<clang::TemplateSpecializationType>(
161+
type.getTypePtr())) {
162+
AddTemplateArgs(spec->template_arguments());
163+
}
164+
return AddType(desugared);
160165
}
161-
162-
assert(!type->isMemberPointerType() && "member pointers are not scanned");
163-
AddType(type.getSingleStepDesugaredType(ctx_));
164-
if (type->isAnyPointerType() || type->isReferenceType()) {
165-
AddType(type->getPointeeType());
166+
if (type->isBuiltinType()) {
167+
return;
168+
}
169+
if (type->isPointerType() || type->isReferenceType()) {
170+
return AddType(type->getPointeeType());
166171
}
167172
if (const auto *array = ctx_.getAsArrayType(type)) {
168-
AddType(array->getElementType());
173+
return AddType(array->getElementType());
169174
}
170175
if (const auto *fn = type->getAs<clang::FunctionType>()) {
171176
AddType(fn->getReturnType());
@@ -174,17 +179,23 @@ class RuleUsageCollector
174179
AddType(param);
175180
}
176181
}
182+
return;
177183
}
178-
if (const auto *spec = type->getAs<clang::TemplateSpecializationType>()) {
179-
AddTemplateArgs(spec->template_arguments());
184+
if (const auto *enum_decl = type->getAsEnumDecl()) {
185+
return AddType(enum_decl->getIntegerType());
180186
}
181-
if (auto *record = type->getAsCXXRecordDecl()) {
182-
if (const auto *spec =
183-
llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(record)) {
184-
AddTemplateArgs(spec->getTemplateArgs().asArray());
187+
if (type->isRecordType()) {
188+
if (auto *record = type->getAsCXXRecordDecl()) {
189+
if (const auto *spec =
190+
llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(
191+
record)) {
192+
AddTemplateArgs(spec->getTemplateArgs().asArray());
193+
}
194+
AddSpecialMembers(record);
185195
}
186-
AddSpecialMembers(record);
196+
return;
187197
}
198+
assert(0 && "type is not scanned");
188199
}
189200

190201
void AddSpecialMembers(clang::CXXRecordDecl *record) {

0 commit comments

Comments
 (0)