Use a safe default width for template-diff'ing integral arguments, in

case we can't find an exact width to use. Fixes crash in
<rdar://problem/12456626>.

llvm-svn: 170951
This commit is contained in:
Douglas Gregor 2012-12-21 23:03:27 +00:00
parent e1826d7464
commit 2d5a5613ce
2 changed files with 19 additions and 1 deletions

View File

@ -848,7 +848,7 @@ class TemplateDiff {
dyn_cast<NonTypeTemplateParmDecl>(ParamND)) {
Expr *FromExpr, *ToExpr;
llvm::APSInt FromInt, ToInt;
unsigned ParamWidth = 0;
unsigned ParamWidth = 128; // Safe default
if (DefaultNTTPD->getType()->isIntegralOrEnumerationType())
ParamWidth = Context.getIntWidth(DefaultNTTPD->getType());
bool HasFromInt = !FromIter.isEnd() &&

View File

@ -812,6 +812,24 @@ namespace PR14489 {
// CHECK-ELIDE-NOTREE: non-const lvalue reference to type 'VariableList<>' cannot bind to a temporary of type 'VariableList<>'
}
namespace rdar12456626 {
struct IntWrapper {
typedef int type;
};
template<typename T, typename T::type V>
struct X { };
struct A {
virtual X<IntWrapper, 1> foo();
};
struct B : A {
// CHECK-ELIDE-NOTREE: virtual function 'foo' has a different return type
virtual X<IntWrapper, 2> foo();
};
}
// CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated.
// CHECK-NOELIDE-NOTREE: {{[0-9]*}} errors generated.
// CHECK-ELIDE-TREE: {{[0-9]*}} errors generated.