[clang] af80b8c - PR44684: Look through parens and similar constructs when determining
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 28 06:05:13 PST 2020
I reverted this for now in aaae6b1b617378362462c1685e754813ed82b394 . The
commit message of the revert has a link to a bot on the official waterfall
as well (but it's the same error as on my bots).
On Mon, Jan 27, 2020 at 10:05 PM Nico Weber <thakis at chromium.org> wrote:
> This seems to break check-clang-tools on non-Linux:
> http://45.33.8.238/mac/6529/step_8.txt
> http://45.33.8.238/win/6770/step_8.txt
>
> On Mon, Jan 27, 2020 at 9:21 PM Richard Smith via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>>
>> Author: Richard Smith
>> Date: 2020-01-27T18:20:57-08:00
>> New Revision: af80b8ccc5772c14920d4554b7ca7e15f2fad1c4
>>
>> URL:
>> https://github.com/llvm/llvm-project/commit/af80b8ccc5772c14920d4554b7ca7e15f2fad1c4
>> DIFF:
>> https://github.com/llvm/llvm-project/commit/af80b8ccc5772c14920d4554b7ca7e15f2fad1c4.diff
>>
>> LOG: PR44684: Look through parens and similar constructs when determining
>> whether a call is to a builtin.
>>
>> We already had a general mechanism to do this but for some reason
>> weren't using it. In passing, check for the other unary operators that
>> can intervene in a reasonably-direct function call (we already handled
>> '&' but missed '*' and '+').
>>
>> Added:
>>
>>
>> Modified:
>> clang/lib/AST/Expr.cpp
>> clang/lib/AST/ExprConstant.cpp
>> clang/test/Parser/builtin_classify_type.c
>> clang/test/Sema/constant-builtins.c
>>
>> Removed:
>>
>>
>>
>>
>> ################################################################################
>> diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
>> index 20505b21b15c..c2f73c2dc9d5 100644
>> --- a/clang/lib/AST/Expr.cpp
>> +++ b/clang/lib/AST/Expr.cpp
>> @@ -1443,19 +1443,28 @@ void CallExpr::updateDependenciesFromArg(Expr
>> *Arg) {
>> Decl *Expr::getReferencedDeclOfCallee() {
>> Expr *CEE = IgnoreParenImpCasts();
>>
>> - while (SubstNonTypeTemplateParmExpr *NTTP
>> - =
>> dyn_cast<SubstNonTypeTemplateParmExpr>(CEE)) {
>> - CEE = NTTP->getReplacement()->IgnoreParenCasts();
>> + while (SubstNonTypeTemplateParmExpr *NTTP =
>> + dyn_cast<SubstNonTypeTemplateParmExpr>(CEE)) {
>> + CEE = NTTP->getReplacement()->IgnoreParenImpCasts();
>> }
>>
>> // If we're calling a dereference, look at the pointer instead.
>> - if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) {
>> - if (BO->isPtrMemOp())
>> - CEE = BO->getRHS()->IgnoreParenCasts();
>> - } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) {
>> - if (UO->getOpcode() == UO_Deref)
>> - CEE = UO->getSubExpr()->IgnoreParenCasts();
>> + while (true) {
>> + if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) {
>> + if (BO->isPtrMemOp()) {
>> + CEE = BO->getRHS()->IgnoreParenImpCasts();
>> + continue;
>> + }
>> + } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) {
>> + if (UO->getOpcode() == UO_Deref || UO->getOpcode() == UO_AddrOf ||
>> + UO->getOpcode() == UO_Plus) {
>> + CEE = UO->getSubExpr()->IgnoreParenImpCasts();
>> + continue;
>> + }
>> + }
>> + break;
>> }
>> +
>> if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE))
>> return DRE->getDecl();
>> if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE))
>> @@ -1466,28 +1475,11 @@ Decl *Expr::getReferencedDeclOfCallee() {
>> return nullptr;
>> }
>>
>> -/// getBuiltinCallee - If this is a call to a builtin, return the
>> builtin ID. If
>> -/// not, return 0.
>> +/// If this is a call to a builtin, return the builtin ID. If not,
>> return 0.
>> unsigned CallExpr::getBuiltinCallee() const {
>> - // All simple function calls (e.g. func()) are implicitly cast to
>> pointer to
>> - // function. As a result, we try and obtain the DeclRefExpr from the
>> - // ImplicitCastExpr.
>> - const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
>> - if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(),
>> (*func)()).
>> - return 0;
>> -
>> - const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
>> - if (!DRE)
>> - return 0;
>> -
>> - const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
>> - if (!FDecl)
>> - return 0;
>> -
>> - if (!FDecl->getIdentifier())
>> - return 0;
>> -
>> - return FDecl->getBuiltinID();
>> + auto *FDecl =
>> +
>> dyn_cast_or_null<FunctionDecl>(getCallee()->getReferencedDeclOfCallee());
>> + return FDecl ? FDecl->getBuiltinID() : 0;
>> }
>>
>> bool CallExpr::isUnevaluatedBuiltinCall(const ASTContext &Ctx) const {
>>
>> diff --git a/clang/lib/AST/ExprConstant.cpp
>> b/clang/lib/AST/ExprConstant.cpp
>> index c79973507323..75554c4692e9 100644
>> --- a/clang/lib/AST/ExprConstant.cpp
>> +++ b/clang/lib/AST/ExprConstant.cpp
>> @@ -10660,7 +10660,7 @@ static bool getBuiltinAlignArguments(const
>> CallExpr *E, EvalInfo &Info,
>>
>> bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
>> unsigned BuiltinOp) {
>> - switch (unsigned BuiltinOp = E->getBuiltinCallee()) {
>> + switch (BuiltinOp) {
>> default:
>> return ExprEvaluatorBaseTy::VisitCallExpr(E);
>>
>>
>> diff --git a/clang/test/Parser/builtin_classify_type.c
>> b/clang/test/Parser/builtin_classify_type.c
>> index 63fd8e28045a..94434e9f2ee4 100644
>> --- a/clang/test/Parser/builtin_classify_type.c
>> +++ b/clang/test/Parser/builtin_classify_type.c
>> @@ -9,7 +9,7 @@ int main() {
>> struct foo s;
>>
>> static int ary[__builtin_classify_type(a)];
>> - static int ary2[(__builtin_classify_type)(a)]; //
>> expected-error{{variable length array declaration cannot have 'static'
>> storage duration}}
>> + static int ary2[(__builtin_classify_type)(a)];
>> static int ary3[(*__builtin_classify_type)(a)]; //
>> expected-error{{builtin functions must be directly called}}
>>
>> int result;
>>
>> diff --git a/clang/test/Sema/constant-builtins.c
>> b/clang/test/Sema/constant-builtins.c
>> index c98f62dfc5a2..ae3b9135c965 100644
>> --- a/clang/test/Sema/constant-builtins.c
>> +++ b/clang/test/Sema/constant-builtins.c
>> @@ -25,4 +25,13 @@ short somefunc();
>>
>> short t = __builtin_constant_p(5353) ? 42 : somefunc();
>>
>> -
>> +// PR44684
>> +_Static_assert((__builtin_clz)(1u) >= 15, "");
>> +_Static_assert((__builtin_popcount)(1u) == 1, "");
>> +_Static_assert((__builtin_ctz)(2u) == 1, "");
>> +_Static_assert(_Generic(1u,unsigned:__builtin_clz)(1u) >= 15, "");
>> +_Static_assert(_Generic(1u,unsigned:__builtin_popcount)(1u) == 1, "");
>> +_Static_assert(_Generic(1u,unsigned:__builtin_ctz)(2u) == 1, "");
>> +
>> +__SIZE_TYPE__ strlen(const char*);
>> +_Static_assert((__builtin_constant_p(1) ? (***&strlen)("foo") : 0) == 3,
>> "");
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200128/98a126e9/attachment-0001.html>
More information about the cfe-commits
mailing list