|
8 | 8 | #include <clang/Lex/Lexer.h> |
9 | 9 | #include <llvm/Support/ThreadPool.h> |
10 | 10 |
|
| 11 | +#include <cstdlib> |
11 | 12 | #include <format> |
12 | 13 | #include <optional> |
13 | 14 | #include <regex> |
@@ -434,7 +435,18 @@ void addRulesFromDirectory(const std::filesystem::path &dir, Model model) { |
434 | 435 | exprs_.emplace(GetExprMapKey(rule.src), std::move(rule)); |
435 | 436 | } |
436 | 437 | 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)); |
438 | 450 | } |
439 | 451 | } |
440 | 452 | } |
@@ -929,8 +941,8 @@ void LoadTranslationRules(Model model, clang::ASTContext &ctx, |
929 | 941 | } |
930 | 942 | translation_rules_loaded_ = true; |
931 | 943 |
|
932 | | - addRulesFromDirectory(rules_dir, model); |
933 | 944 | addBuiltinTypes(model); |
| 945 | + addRulesFromDirectory(rules_dir, model); |
934 | 946 |
|
935 | 947 | #if 0 |
936 | 948 | for (auto &[src, rule] : exprs_) { |
|
0 commit comments