[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

Benjamin Kramer benny.kra at googlemail.com
Thu Jun 7 08:56:16 PDT 2012


On 07.06.2012, at 17:31, Dmitri Gribenko wrote:

> 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.

Oops, fixed in r158151. Thanks Dmitri!

- Ben



More information about the cfe-commits mailing list