aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/clang/lib/AST/Interp/InterpShared.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/clang/lib/AST/Interp/InterpShared.cpp')
-rw-r--r--contrib/llvm-project/clang/lib/AST/Interp/InterpShared.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/contrib/llvm-project/clang/lib/AST/Interp/InterpShared.cpp b/contrib/llvm-project/clang/lib/AST/Interp/InterpShared.cpp
new file mode 100644
index 000000000000..6af03691f1b2
--- /dev/null
+++ b/contrib/llvm-project/clang/lib/AST/Interp/InterpShared.cpp
@@ -0,0 +1,42 @@
+//===--- InterpShared.cpp ---------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "InterpShared.h"
+#include "clang/AST/Attr.h"
+#include "llvm/ADT/BitVector.h"
+
+namespace clang {
+namespace interp {
+
+llvm::BitVector collectNonNullArgs(const FunctionDecl *F,
+ const llvm::ArrayRef<const Expr *> &Args) {
+ llvm::BitVector NonNullArgs;
+ if (!F)
+ return NonNullArgs;
+
+ assert(F);
+ NonNullArgs.resize(Args.size());
+
+ for (const auto *Attr : F->specific_attrs<NonNullAttr>()) {
+ if (!Attr->args_size()) {
+ NonNullArgs.set();
+ break;
+ } else
+ for (auto Idx : Attr->args()) {
+ unsigned ASTIdx = Idx.getASTIndex();
+ if (ASTIdx >= Args.size())
+ continue;
+ NonNullArgs[ASTIdx] = true;
+ }
+ }
+
+ return NonNullArgs;
+}
+
+} // namespace interp
+} // namespace clang