[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