clang  10.0.0svn
State.h
Go to the documentation of this file.
1 //===--- State.h - State chain for the VM and AST Walker --------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Defines the base class of the interpreter and evaluator state.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_AST_INTERP_STATE_H
14 #define LLVM_CLANG_AST_INTERP_STATE_H
15 
17 #include "clang/AST/Expr.h"
19 
20 namespace clang {
21 
22 /// Kinds of access we can perform on an object, for diagnostics. Note that
23 /// we consider a member function call to be a kind of access, even though
24 /// it is not formally an access of the object, because it has (largely) the
25 /// same set of semantic restrictions.
37 };
38 
39 // The order of this enum is important for diagnostics.
48 };
49 
50 namespace interp {
51 class Frame;
52 class SourceInfo;
53 
54 /// Interface for the VM to interact with the AST walker's context.
55 class State {
56 public:
57  virtual ~State();
58 
59  virtual bool checkingForUndefinedBehavior() const = 0;
60  virtual bool checkingPotentialConstantExpression() const = 0;
61  virtual bool noteUndefinedBehavior() = 0;
62  virtual bool keepEvaluatingAfterFailure() const = 0;
63  virtual Frame *getCurrentFrame() = 0;
64  virtual const Frame *getBottomFrame() const = 0;
65  virtual bool hasActiveDiagnostic() = 0;
66  virtual void setActiveDiagnostic(bool Flag) = 0;
67  virtual void setFoldFailureDiagnostic(bool Flag) = 0;
68  virtual Expr::EvalStatus &getEvalStatus() const = 0;
69  virtual ASTContext &getCtx() const = 0;
70  virtual bool hasPriorDiagnostic() = 0;
71  virtual unsigned getCallStackDepth() = 0;
72 
73 public:
74  // Diagnose that the evaluation could not be folded (FF => FoldFailure)
77  diag::kind DiagId = diag::note_invalid_subexpr_in_const_expr,
78  unsigned ExtraNotes = 0);
79 
81  FFDiag(const Expr *E,
82  diag::kind DiagId = diag::note_invalid_subexpr_in_const_expr,
83  unsigned ExtraNotes = 0);
84 
86  FFDiag(const SourceInfo &SI,
87  diag::kind DiagId = diag::note_invalid_subexpr_in_const_expr,
88  unsigned ExtraNotes = 0);
89 
90  /// Diagnose that the evaluation does not produce a C++11 core constant
91  /// expression.
92  ///
93  /// FIXME: Stop evaluating if we're in EM_ConstantExpression or
94  /// EM_PotentialConstantExpression mode and we produce one of these.
97  diag::kind DiagId = diag::note_invalid_subexpr_in_const_expr,
98  unsigned ExtraNotes = 0);
99 
101  CCEDiag(const Expr *E,
102  diag::kind DiagId = diag::note_invalid_subexpr_in_const_expr,
103  unsigned ExtraNotes = 0);
104 
106  CCEDiag(const SourceInfo &SI,
107  diag::kind DiagId = diag::note_invalid_subexpr_in_const_expr,
108  unsigned ExtraNotes = 0);
109 
110  /// Add a note to a prior diagnostic.
112 
113  /// Add a stack of notes to a prior diagnostic.
115 
116  /// Directly reports a diagnostic message.
118 
119  const LangOptions &getLangOpts() const;
120 
121 private:
122  void addCallStack(unsigned Limit);
123 
124  PartialDiagnostic &addDiag(SourceLocation Loc, diag::kind DiagId);
125 
127  unsigned ExtraNotes, bool IsCCEDiag);
128 };
129 
130 } // namespace interp
131 } // namespace clang
132 
133 #endif
virtual Expr::EvalStatus & getEvalStatus() const =0
DiagnosticBuilder report(SourceLocation Loc, diag::kind DiagId)
Directly reports a diagnostic message.
Definition: State.cpp:75
Describes the statement/declaration an opcode was generated from.
Definition: Source.h:81
virtual ASTContext & getCtx() const =0
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:160
virtual ~State()
Definition: State.cpp:18
AccessKinds
Kinds of access we can perform on an object, for diagnostics.
Definition: State.h:26
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:49
virtual unsigned getCallStackDepth()=0
virtual bool keepEvaluatingAfterFailure() const =0
virtual bool checkingForUndefinedBehavior() const =0
A little helper class used to produce diagnostics.
Definition: Diagnostic.h:1043
virtual void setFoldFailureDiagnostic(bool Flag)=0
This represents one expression.
Definition: Expr.h:108
Implements a partial diagnostic which may not be emitted.
virtual bool hasActiveDiagnostic()=0
virtual void setActiveDiagnostic(bool Flag)=0
A partial diagnostic which we might know in advance that we are not going to emit.
OptionalDiagnostic FFDiag(SourceLocation Loc, diag::kind DiagId=diag::note_invalid_subexpr_in_const_expr, unsigned ExtraNotes=0)
Definition: State.cpp:20
Base class for stack frames, shared between VM and walker.
Definition: Frame.h:25
virtual Frame * getCurrentFrame()=0
virtual bool noteUndefinedBehavior()=0
Encodes a location in the source.
OptionalDiagnostic Note(SourceLocation Loc, diag::kind DiagId)
Add a note to a prior diagnostic.
Definition: State.cpp:62
EvalStatus is a struct with detailed info about an evaluation in progress.
Definition: Expr.h:550
Dataflow Directional Tag Classes.
virtual bool checkingPotentialConstantExpression() const =0
void addNotes(ArrayRef< PartialDiagnosticAt > Diags)
Add a stack of notes to a prior diagnostic.
Definition: State.cpp:68
virtual bool hasPriorDiagnostic()=0
const LangOptions & getLangOpts() const
Definition: State.cpp:115
OptionalDiagnostic CCEDiag(SourceLocation Loc, diag::kind DiagId=diag::note_invalid_subexpr_in_const_expr, unsigned ExtraNotes=0)
Diagnose that the evaluation does not produce a C++11 core constant expression.
Definition: State.cpp:41
Interface for the VM to interact with the AST walker&#39;s context.
Definition: State.h:55
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Definition: DiagnosticIDs.h:60
virtual const Frame * getBottomFrame() const =0
CheckSubobjectKind
Definition: State.h:40