summaryrefslogtreecommitdiff
path: root/include/clang/AST/CurrentSourceLocExprScope.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/AST/CurrentSourceLocExprScope.h')
-rw-r--r--include/clang/AST/CurrentSourceLocExprScope.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/include/clang/AST/CurrentSourceLocExprScope.h b/include/clang/AST/CurrentSourceLocExprScope.h
new file mode 100644
index 000000000000..4ebbdf63abb5
--- /dev/null
+++ b/include/clang/AST/CurrentSourceLocExprScope.h
@@ -0,0 +1,75 @@
+//===--- CurrentSourceLocExprScope.h ----------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines types used to track the current context needed to evaluate
+// a SourceLocExpr.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_AST_CURRENT_SOURCE_LOC_EXPR_SCOPE_H
+#define LLVM_CLANG_AST_CURRENT_SOURCE_LOC_EXPR_SCOPE_H
+
+#include <cassert>
+
+namespace clang {
+class Expr;
+
+/// Represents the current source location and context used to determine the
+/// value of the source location builtins (ex. __builtin_LINE), including the
+/// context of default argument and default initializer expressions.
+class CurrentSourceLocExprScope {
+ /// The CXXDefaultArgExpr or CXXDefaultInitExpr we're currently evaluating.
+ const Expr *DefaultExpr = nullptr;
+
+public:
+ /// A RAII style scope guard used for tracking the current source
+ /// location and context as used by the source location builtins
+ /// (ex. __builtin_LINE).
+ class SourceLocExprScopeGuard;
+
+ const Expr *getDefaultExpr() const { return DefaultExpr; }
+
+ explicit CurrentSourceLocExprScope() = default;
+
+private:
+ explicit CurrentSourceLocExprScope(const Expr *DefaultExpr)
+ : DefaultExpr(DefaultExpr) {}
+
+ CurrentSourceLocExprScope(CurrentSourceLocExprScope const &) = default;
+ CurrentSourceLocExprScope &
+ operator=(CurrentSourceLocExprScope const &) = default;
+};
+
+class CurrentSourceLocExprScope::SourceLocExprScopeGuard {
+public:
+ SourceLocExprScopeGuard(const Expr *DefaultExpr,
+ CurrentSourceLocExprScope &Current)
+ : Current(Current), OldVal(Current), Enable(false) {
+ assert(DefaultExpr && "the new scope should not be empty");
+ if ((Enable = (Current.getDefaultExpr() == nullptr)))
+ Current = CurrentSourceLocExprScope(DefaultExpr);
+ }
+
+ ~SourceLocExprScopeGuard() {
+ if (Enable)
+ Current = OldVal;
+ }
+
+private:
+ SourceLocExprScopeGuard(SourceLocExprScopeGuard const &) = delete;
+ SourceLocExprScopeGuard &operator=(SourceLocExprScopeGuard const &) = delete;
+
+ CurrentSourceLocExprScope &Current;
+ CurrentSourceLocExprScope OldVal;
+ bool Enable;
+};
+
+} // end namespace clang
+
+#endif // LLVM_CLANG_AST_CURRENT_SOURCE_LOC_EXPR_SCOPE_H