[clang] af80b8c - PR44684: Look through parens and similar constructs when determining

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 27 19:05:41 PST 2020


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/20200127/34f4b4a6/attachment.html>


More information about the cfe-commits mailing list