SemaInternal.h revision 651f13cea278ec967336033dd032faef0e9fc2ec
1//===--- SemaInternal.h - Internal Sema Interfaces --------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file provides common API and #includes for the internal 11// implementation of Sema. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_CLANG_SEMA_SEMA_INTERNAL_H 16#define LLVM_CLANG_SEMA_SEMA_INTERNAL_H 17 18#include "clang/AST/ASTContext.h" 19#include "clang/Sema/Sema.h" 20#include "clang/Sema/SemaDiagnostic.h" 21 22namespace clang { 23 24inline PartialDiagnostic Sema::PDiag(unsigned DiagID) { 25 return PartialDiagnostic(DiagID, Context.getDiagAllocator()); 26} 27 28 29// This requires the variable to be non-dependent and the initializer 30// to not be value dependent. 31inline bool IsVariableAConstantExpression(VarDecl *Var, ASTContext &Context) { 32 const VarDecl *DefVD = 0; 33 return !isa<ParmVarDecl>(Var) && 34 Var->isUsableInConstantExpressions(Context) && 35 Var->getAnyInitializer(DefVD) && DefVD->checkInitIsICE(); 36} 37 38// Directly mark a variable odr-used. Given a choice, prefer to use 39// MarkVariableReferenced since it does additional checks and then 40// calls MarkVarDeclODRUsed. 41// If the variable must be captured: 42// - if FunctionScopeIndexToStopAt is null, capture it in the CurContext 43// - else capture it in the DeclContext that maps to the 44// *FunctionScopeIndexToStopAt on the FunctionScopeInfo stack. 45inline void MarkVarDeclODRUsed(VarDecl *Var, 46 SourceLocation Loc, Sema &SemaRef, 47 const unsigned *const FunctionScopeIndexToStopAt) { 48 // Keep track of used but undefined variables. 49 // FIXME: We shouldn't suppress this warning for static data members. 50 if (Var->hasDefinition(SemaRef.Context) == VarDecl::DeclarationOnly && 51 !Var->isExternallyVisible() && 52 !(Var->isStaticDataMember() && Var->hasInit())) { 53 SourceLocation &old = SemaRef.UndefinedButUsed[Var->getCanonicalDecl()]; 54 if (old.isInvalid()) old = Loc; 55 } 56 QualType CaptureType, DeclRefType; 57 SemaRef.tryCaptureVariable(Var, Loc, Sema::TryCapture_Implicit, 58 /*EllipsisLoc*/ SourceLocation(), 59 /*BuildAndDiagnose*/ true, 60 CaptureType, DeclRefType, 61 FunctionScopeIndexToStopAt); 62 63 Var->markUsed(SemaRef.Context); 64} 65} 66 67#endif 68