Skip to content

Commit

Permalink
[IR/Analysis] Defend against getting slightly wrong template arguments
Browse files Browse the repository at this point in the history
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
reliably places for this to be instantiated.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294272 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
chandlerc committed Feb 7, 2017
1 parent 167cdd0 commit e4145c2
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 1 deletion.
5 changes: 4 additions & 1 deletion include/llvm/Analysis/PtrUseVisitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,10 @@ class PtrUseVisitor : protected InstVisitor<DerivedT>,
typedef InstVisitor<DerivedT> Base;

public:
PtrUseVisitor(const DataLayout &DL) : PtrUseVisitorBase(DL) {}
PtrUseVisitor(const DataLayout &DL) : PtrUseVisitorBase(DL) {
static_assert(std::is_base_of<PtrUseVisitor, DerivedT>::value,
"Must pass the derived type to this template!");
}

/// \brief Recursively visit the uses of the given pointer.
/// \returns An info struct about the pointer. See \c PtrInfo for details.
Expand Down
3 changes: 3 additions & 0 deletions include/llvm/IR/InstVisitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,9 @@ class InstVisitor {
// visit - Finally, code to visit an instruction...
//
RetTy visit(Instruction &I) {
static_assert(std::is_base_of<InstVisitor, SubClass>::value,
"Must pass the derived type to this template!");

switch (I.getOpcode()) {
default: llvm_unreachable("Unknown instruction type encountered!");
// Build the switch statement using the Instruction.def file...
Expand Down

0 comments on commit e4145c2

Please sign in to comment.