diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-12-23 18:44:58 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-12-23 18:44:58 +0000 |
commit | 38b9ad88e2b235865a4f4864d7c198cf09fbd434 (patch) | |
tree | 5ed1597c494a42e6ded53617535207c5dae0b3d8 /clang/lib/Sema/SemaTemplate.cpp | |
parent | 66ffa50e6d2e807101d4c782790e6ae1b1680a5f (diff) | |
download | bcm5719-llvm-38b9ad88e2b235865a4f4864d7c198cf09fbd434.tar.gz bcm5719-llvm-38b9ad88e2b235865a4f4864d7c198cf09fbd434.zip |
Fix the overflow calculation in Sema::CheckTemplateArgument to be a bit more
accurate.
llvm-svn: 92018
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index e6bd77d208a..3dd02430919 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -2488,7 +2488,14 @@ bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, // Check that we don't overflow the template parameter type. unsigned AllowedBits = Context.getTypeSize(IntegerType); - if (Value.getActiveBits() > AllowedBits) { + unsigned RequiredBits; + if (IntegerType->isUnsignedIntegerType()) + RequiredBits = Value.getActiveBits(); + else if (Value.isUnsigned()) + RequiredBits = Value.getActiveBits() + 1; + else + RequiredBits = Value.getMinSignedBits(); + if (RequiredBits > AllowedBits) { Diag(Arg->getSourceRange().getBegin(), diag::err_template_arg_too_large) << Value.toString(10) << Param->getType() |