ScopeInfo.h revision 6b5a61b6dc400027fd793dcadceeb9da944a37ea
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- ScopeInfo.h - Information about a semantic context -----*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  This file defines FunctionScopeInfo and BlockScopeInfo.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LLVM_CLANG_SEMA_SCOPE_INFO_H
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_CLANG_SEMA_SCOPE_INFO_H
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/Type.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/DenseMap.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/SmallVector.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/SetVector.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace clang {
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass BlockDecl;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IdentifierInfo;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LabelStmt;
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ReturnStmt;
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Scope;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SwitchStmt;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sema {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Retains information about a function, method, or block that is
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// currently being parsed.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FunctionScopeInfo {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Whether this scope information structure defined information for
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// a block.
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool IsBlockInfo;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Whether this function contains a VLA, @try, try, C++
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// initializer, or anything else that can't be jumped past.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasBranchProtectedScope;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// \brief Whether this function contains any switches or direct gotos.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasBranchIntoScope;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Whether this function contains any indirect gotos.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasIndirectGoto;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Used to determine if errors occurred in this function or block.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DiagnosticErrorTrap ErrorTrap;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// LabelMap - This is a mapping from label identifiers to the LabelStmt for
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// it (which acts like the label decl in some ways).  Forward referenced
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// labels have a LabelStmt created for them with a null location & SubStmt.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::DenseMap<IdentifierInfo*, LabelStmt*> LabelMap;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// SwitchStack - This is the current set of active switch statements in the
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// block.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::SmallVector<SwitchStmt*, 8> SwitchStack;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief The list of return statements that occur within the function or
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// block, if there is any chance of applying the named return value
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// optimization.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::SmallVector<ReturnStmt *, 4> Returns;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void setHasBranchIntoScope() {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HasBranchIntoScope = true;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void setHasBranchProtectedScope() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HasBranchProtectedScope = true;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void setHasIndirectGoto() {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HasIndirectGoto = true;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool NeedsScopeChecking() const {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HasIndirectGoto ||
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (HasBranchProtectedScope && HasBranchIntoScope);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FunctionScopeInfo(Diagnostic &Diag)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : IsBlockInfo(false),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HasBranchProtectedScope(false),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HasBranchIntoScope(false),
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HasIndirectGoto(false),
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ErrorTrap(Diag) { }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FunctionScopeInfo();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Clear out the information in this function scope, making it
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// suitable for reuse.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool classof(const FunctionScopeInfo *FSI) { return true; }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Retains information about a block that is currently being parsed.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockScopeInfo : public FunctionScopeInfo {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BlockDecl *TheDecl;
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// TheScope - This is the scope for the block itself, which contains
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// arguments etc.
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Scope *TheScope;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// ReturnType - The return type of the block, or null if the block
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// signature didn't provide an explicit return type.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QualType ReturnType;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// BlockType - The function type of the block, if one was given.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Its return type may be BuiltinType::Dependent.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QualType FunctionType;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// CaptureMap - A map of captured variables to (index+1) into Captures.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::DenseMap<VarDecl*, unsigned> CaptureMap;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Captures - The captured variables.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::SmallVector<BlockDecl::Capture, 4> Captures;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// CapturesCXXThis - Whether this block captures 'this'.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CapturesCXXThis;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockScopeInfo(Diagnostic &Diag, Scope *BlockScope, BlockDecl *Block)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FunctionScopeInfo(Diag), TheDecl(Block), TheScope(BlockScope),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CapturesCXXThis(false)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IsBlockInfo = true;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BlockScopeInfo();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool classof(const FunctionScopeInfo *FSI) { return FSI->IsBlockInfo; }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool classof(const BlockScopeInfo *BSI) { return true; }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)