diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-03-26 00:39:40 +0000 | 
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-03-26 00:39:40 +0000 | 
| commit | a14cb9fd38bb9bf61dbcc39d0069c4b564fcb9dd (patch) | |
| tree | fbd3a86780902914bab78128b5b2e6f614d9508d /clang/lib/Sema | |
| parent | 5b334084818a5897051aa1063bf24a5bb3890373 (diff) | |
| download | bcm5719-llvm-a14cb9fd38bb9bf61dbcc39d0069c4b564fcb9dd.tar.gz bcm5719-llvm-a14cb9fd38bb9bf61dbcc39d0069c4b564fcb9dd.zip | |
Revert attempted fix for integral template arguments. It seems to have broken tramp3d-v4.
llvm-svn: 99583
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 39 | 
1 files changed, 19 insertions, 20 deletions
| diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 0102aefa7ea..5a1bec927c4 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -2554,39 +2554,38 @@ bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,        IntegerType = Context.getCanonicalType(Enum->getDecl()->getIntegerType());      if (!Arg->isValueDependent()) { -      llvm::APSInt OldValue = Value; -       -      // Coerce the template argument's value to the value it will have  -      // based on the template parameter's type. -      unsigned AllowedBits = Context.getTypeSize(IntegerType); -      Value.setIsSigned(IntegerType->isSignedIntegerType()); -      if (Value.getBitWidth() != AllowedBits) -        Value.extOrTrunc(AllowedBits); - -      // Complain if an unsigned parameter received a negative value. +      // Check that an unsigned parameter does not receive a negative +      // value.        if (IntegerType->isUnsignedIntegerType() -          && (OldValue.isSigned() && OldValue.isNegative())) { -        Diag(Arg->getSourceRange().getBegin(), diag::warn_template_arg_negative) -          << OldValue.toString(10) << Value.toString(10) << Param->getType() +          && (Value.isSigned() && Value.isNegative())) { +        Diag(Arg->getSourceRange().getBegin(), diag::err_template_arg_negative) +          << Value.toString(10) << Param->getType()            << Arg->getSourceRange();          Diag(Param->getLocation(), diag::note_template_param_here); +        return true;        } -      // Complain if we overflowed the template parameter's type. +      // Check that we don't overflow the template parameter type. +      unsigned AllowedBits = Context.getTypeSize(IntegerType);        unsigned RequiredBits;        if (IntegerType->isUnsignedIntegerType()) -        RequiredBits = OldValue.getActiveBits(); -      else if (OldValue.isUnsigned()) -        RequiredBits = OldValue.getActiveBits() + 1; +        RequiredBits = Value.getActiveBits(); +      else if (Value.isUnsigned()) +        RequiredBits = Value.getActiveBits() + 1;        else -        RequiredBits = OldValue.getMinSignedBits(); +        RequiredBits = Value.getMinSignedBits();        if (RequiredBits > AllowedBits) {          Diag(Arg->getSourceRange().getBegin(), -             diag::warn_template_arg_too_large) -          << OldValue.toString(10) << Value.toString(10) << Param->getType() +             diag::err_template_arg_too_large) +          << Value.toString(10) << Param->getType()            << Arg->getSourceRange();          Diag(Param->getLocation(), diag::note_template_param_here); +        return true;        } + +      if (Value.getBitWidth() != AllowedBits) +        Value.extOrTrunc(AllowedBits); +      Value.setIsSigned(IntegerType->isSignedIntegerType());      }      // Add the value of this argument to the list of converted | 

