From: Richard Smith Date: Fri, 28 Sep 2012 20:20:52 +0000 (+0000) Subject: Allow __builtin_bswap32/64 in constant expressions, like gcc does. Patch by Tijl... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=70d38f3179251bb3e7253a52bf54f8fa2314590a;p=clang Allow __builtin_bswap32/64 in constant expressions, like gcc does. Patch by Tijl Coosemans! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164841 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 8f3f84d07d..c4fd70a8c8 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -4296,6 +4296,15 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { return Error(E); } + case Builtin::BI__builtin_bswap32: + case Builtin::BI__builtin_bswap64: { + APSInt Val; + if (!EvaluateInteger(E->getArg(0), Val, Info)) + return false; + + return Success(Val.byteSwap(), E); + } + case Builtin::BI__builtin_classify_type: return Success(EvaluateBuiltinClassifyType(E), E); diff --git a/test/Sema/constant-builtins-2.c b/test/Sema/constant-builtins-2.c index 68b46bf19a..d78a176ef4 100644 --- a/test/Sema/constant-builtins-2.c +++ b/test/Sema/constant-builtins-2.c @@ -48,6 +48,8 @@ extern int f(); int h0 = __builtin_types_compatible_p(int, float); //int h1 = __builtin_choose_expr(1, 10, f()); //int h2 = __builtin_expect(0, 0); +int h3 = __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f(); +int h4 = __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f(); extern long int bi0; extern __typeof__(__builtin_expect(0, 0)) bi0; diff --git a/test/Sema/constant-builtins.c b/test/Sema/constant-builtins.c index 5d67fc7cb7..1562623c0a 100644 --- a/test/Sema/constant-builtins.c +++ b/test/Sema/constant-builtins.c @@ -16,6 +16,8 @@ extern int f(); int h0 = __builtin_types_compatible_p(int,float); //int h1 = __builtin_choose_expr(1, 10, f()); //int h2 = __builtin_expect(0, 0); +int h3 = __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f(); +int h4 = __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f(); short somefunc();