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:
parent
e1826d7464
commit
2d5a5613ce
|
@ -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() &&
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue