[cfe-commits] r158150 - in /cfe/trunk: include/clang/AST/TemplateBase.h include/clang/Sema/Template.h lib/AST/ASTContext.cpp lib/AST/ASTImporter.cpp lib/AST/DumpXML.cpp lib/AST/ItaniumMangle.cpp lib/AST/MicrosoftMangle.cpp lib/AST/StmtPrinter.cpp

Dmitri Gribenko gribozavr at gmail.com
Thu Jun 7 08:31:29 PDT 2012


Hi Benjamin,

On Thu, Jun 7, 2012 at 8:09 AM, Benjamin Kramer
<benny.kra at googlemail.com> wrote:
> Modified: cfe/trunk/lib/AST/TemplateBase.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TemplateBase.cpp?rev=158150&r1=158149&r2=158150&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/TemplateBase.cpp (original)
> +++ cfe/trunk/lib/AST/TemplateBase.cpp Thu Jun  7 10:09:51 2012
> @@ -36,17 +36,17 @@
>  static void printIntegral(const TemplateArgument &TemplArg,
>                           raw_ostream &Out) {
>   const ::clang::Type *T = TemplArg.getIntegralType().getTypePtr();
> -  const llvm::APSInt *Val = TemplArg.getAsIntegral();
> +  const llvm::APSInt &Val = TemplArg.getAsIntegral();
>
>   if (T->isBooleanType()) {
> -    Out << (Val->getBoolValue() ? "true" : "false");
> +    Out << (Val.getBoolValue() ? "true" : "false");
>   } else if (T->isCharType()) {
> -    const char Ch = Val->getZExtValue();
> +    const char Ch = Val.getZExtValue();
>     Out << ((Ch == '\'') ? "'\\" : "'");
>     Out.write_escaped(StringRef(&Ch, 1), /*UseHexEscapes=*/ true);
>     Out << "'";
>   } else {
> -    Out << Val->toString(10);
> +    Out << Val;
>   }
>  }
>
> @@ -54,6 +54,24 @@
>  // TemplateArgument Implementation
>  //===----------------------------------------------------------------------===//
>
> +TemplateArgument::TemplateArgument(ASTContext &Ctx, const llvm::APSInt &Value,
> +                                   QualType Type)
> +  : Kind(Integral) {
> +  // Copy the APSInt value into our decomposed form.
> +  Integer.BitWidth = Value.getBitWidth();
> +  Integer.IsUnsigned = Value.isUnsigned();
> +  // If the value is large, we have to get additional memory from the ASTContext
> +  if (Integer.BitWidth > 64) {
> +    void *Mem = Ctx.Allocate(Integer.BitWidth / 8);

Shouldn't this be something like:
Ctx.Allocate(Value.getNumWords() * sizeof(uint64_t)); ?

These two expressions differ when BitWidth is not a multiple of
APINT_BITS_PER_WORD.

Same thing in other places where expression Integer.BitWidth / 8 is used.

Dmitri

-- 
main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
(j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/




More information about the cfe-commits mailing list