mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 14:47:00 +00:00
[PM] Defend against getting slightly wrong template arguments passed
into CRTP base classes. This can sometimes happen and not cause an immediate failure when the derived class is, itself, a template. You can end up essentially calling methods on the wrong derived type but a type where many things will appear to "work". To fail fast and with a clear error message we can use a static_assert, but we have to stash that static_assert inside a method body or nested type that won't need to be completed while building the base class. I've tried to pick a reasonably small number of places that seemed like they would definitely get triggered on use. This is the last of the patch series defending against this that I have planned, so far no bugs other than the original were found. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294275 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8c57d78e93
commit
869cf60647
@ -46,7 +46,10 @@ public:
|
||||
|
||||
DerivedT *Handle;
|
||||
|
||||
Analysis(DerivedT &Handle) : Handle(&Handle) {}
|
||||
Analysis(DerivedT &Handle) : Handle(&Handle) {
|
||||
static_assert(std::is_base_of<MockAnalysisHandleBase, DerivedT>::value,
|
||||
"Must pass the derived type to this template!");
|
||||
}
|
||||
|
||||
public:
|
||||
class Result {
|
||||
@ -152,7 +155,10 @@ public:
|
||||
|
||||
DerivedT *Handle;
|
||||
|
||||
Pass(DerivedT &Handle) : Handle(&Handle) {}
|
||||
Pass(DerivedT &Handle) : Handle(&Handle) {
|
||||
static_assert(std::is_base_of<MockPassHandleBase, DerivedT>::value,
|
||||
"Must pass the derived type to this template!");
|
||||
}
|
||||
|
||||
public:
|
||||
PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM,
|
||||
|
Loading…
Reference in New Issue
Block a user