Skip to content

Commit 32cb753

Browse files
committed
Avoid duplicated rules
1 parent ec950d5 commit 32cb753

1 file changed

Lines changed: 14 additions & 2 deletions

File tree

cpp2rust/converter/mapper.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <clang/Lex/Lexer.h>
99
#include <llvm/Support/ThreadPool.h>
1010

11+
#include <cstdlib>
1112
#include <format>
1213
#include <optional>
1314
#include <regex>
@@ -434,7 +435,18 @@ void addRulesFromDirectory(const std::filesystem::path &dir, Model model) {
434435
exprs_.emplace(GetExprMapKey(rule.src), std::move(rule));
435436
}
436437
for (auto &[_, rule] : type_rules) {
437-
types_.emplace(GetTypeMapKey(rule.src), std::move(rule));
438+
auto key = GetTypeMapKey(rule.src);
439+
auto [begin, end] = types_.equal_range(key);
440+
for (auto it = begin; it != end; ++it) {
441+
if (it->second.src == rule.src) {
442+
llvm::errs() << "ERROR: duplicate type rule for C++ type '"
443+
<< rule.src << "': maps to both '"
444+
<< it->second.type_info.type << "' and '"
445+
<< rule.type_info.type << "'\n";
446+
std::exit(EXIT_FAILURE);
447+
}
448+
}
449+
types_.emplace(std::move(key), std::move(rule));
438450
}
439451
}
440452
}
@@ -929,8 +941,8 @@ void LoadTranslationRules(Model model, clang::ASTContext &ctx,
929941
}
930942
translation_rules_loaded_ = true;
931943

932-
addRulesFromDirectory(rules_dir, model);
933944
addBuiltinTypes(model);
945+
addRulesFromDirectory(rules_dir, model);
934946

935947
#if 0
936948
for (auto &[src, rule] : exprs_) {

0 commit comments

Comments
 (0)