[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