From 869cf60647b9450452132695f0a5fc8d16f627a2 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Tue, 7 Feb 2017 03:34:08 +0000 Subject: [PATCH] [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 --- unittests/Transforms/Scalar/LoopPassManagerTest.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/unittests/Transforms/Scalar/LoopPassManagerTest.cpp b/unittests/Transforms/Scalar/LoopPassManagerTest.cpp index 0209927b9f4..227060f0a46 100644 --- a/unittests/Transforms/Scalar/LoopPassManagerTest.cpp +++ b/unittests/Transforms/Scalar/LoopPassManagerTest.cpp @@ -46,7 +46,10 @@ public: DerivedT *Handle; - Analysis(DerivedT &Handle) : Handle(&Handle) {} + Analysis(DerivedT &Handle) : Handle(&Handle) { + static_assert(std::is_base_of::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::value, + "Must pass the derived type to this template!"); + } public: PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, -- 2.50.1