From: Bill Wendling Date: Thu, 22 Nov 2018 22:58:06 +0000 (+0000) Subject: A __builtin_constant_p() returns 0 with a function type. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1034e9ab38bba688ffdf4e315634549a8df91701;p=clang A __builtin_constant_p() returns 0 with a function type. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@347480 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 9301bfb0e9..b1323031d9 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -1935,7 +1935,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, const Expr *Arg = E->getArg(0); QualType ArgType = Arg->getType(); - if (!hasScalarEvaluationKind(ArgType)) + if (!hasScalarEvaluationKind(ArgType) || ArgType->isFunctionType()) // We can only reason about scalar types. return RValue::get(ConstantInt::get(ResultType, 0)); diff --git a/test/CodeGen/builtin-constant-p.c b/test/CodeGen/builtin-constant-p.c index 978ec4c8f5..3f1225fb8b 100644 --- a/test/CodeGen/builtin-constant-p.c +++ b/test/CodeGen/builtin-constant-p.c @@ -128,3 +128,29 @@ int test13() { // CHECK: ret i32 1 return __builtin_constant_p(&test10 != 0); } + +typedef unsigned long uintptr_t; +#define assign(p, v) ({ \ + uintptr_t _r_a_p__v = (uintptr_t)(v); \ + if (__builtin_constant_p(v) && _r_a_p__v == (uintptr_t)0) { \ + union { \ + uintptr_t __val; \ + char __c[1]; \ + } __u = { \ + .__val = (uintptr_t)_r_a_p__v \ + }; \ + *(volatile unsigned int*)&p = *(unsigned int*)(__u.__c); \ + __u.__val; \ + } \ + _r_a_p__v; \ +}) + +typedef void fn_p(void); +extern fn_p *dest_p; + +static void src_fn(void) { +} + +void test14() { + assign(dest_p, src_fn); +}