On Jun 15, 2012, at 10:58 AM, Dmitri Gribenko <[email protected]> wrote:
> Now with a patch. Excuse me for the noise. > > On Fri, Jun 15, 2012 at 10:55 AM, Dmitri Gribenko <[email protected]> wrote: >> Hello, >> >> The attached patch fixes crash-on-invalid when passing 128-bit >> integers to attributes that expect ICEs, for example: >> >> void attr6(void *ptr) __attribute__((nonnull(0x10000000000000001i128))); >> >> The root cause of the problem is using getZExtValue() on 128-bit integers. >> >> Please review. >> >> Dmitri +/// \brief Check if E is a valid integer constant expression. May output an +/// error. /// +/// \param AttrArgNum argument number used in diagnostics. +/// +/// \param E expression to check. +/// +/// \param [out] Val ICE value. +static bool checkICEWithOverflow(Sema &S, + StringRef AttrName, SourceLocation AttrLoc, + unsigned AttrArgNum, const Expr *E, + uint64_t &Val) { + // The argument must be an integer constant expression. + llvm::APSInt Int; + if (E->isTypeDependent() || E->isValueDependent() || + !E->isIntegerConstantExpr(Int, S.Context)) { + S.Diag(AttrLoc, diag::err_attribute_argument_n_not_int) + << AttrName << AttrArgNum << E->getSourceRange(); + return false; + } Could we get a specialized diagnostic for the case where E is type- or value-dependent? At least users will know that, in those cases, we can't support arguments that depend on a template parameter. Otherwise, looks good! - Doug _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
