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 22 namespace clang { 23 24 inline PartialDiagnostic Sema::PDiag(unsigned DiagID) { 25 return PartialDiagnostic(DiagID, Context.getDiagAllocator()); 26 } 27 28 inline bool 29 FTIHasSingleVoidParameter(const DeclaratorChunk::FunctionTypeInfo &FTI) { 30 return FTI.NumParams == 1 && !FTI.isVariadic && 31 FTI.Params[0].Ident == nullptr && FTI.Params[0].Param && 32 cast<ParmVarDecl>(FTI.Params[0].Param)->getType()->isVoidType(); 33 } 34 35 inline bool 36 FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI) { 37 // Assume FTI is well-formed. 38 return FTI.NumParams && !FTIHasSingleVoidParameter(FTI); 39 } 40 41 // This requires the variable to be non-dependent and the initializer 42 // to not be value dependent. 43 inline bool IsVariableAConstantExpression(VarDecl *Var, ASTContext &Context) { 44 const VarDecl *DefVD = nullptr; 45 return !isa<ParmVarDecl>(Var) && 46 Var->isUsableInConstantExpressions(Context) && 47 Var->getAnyInitializer(DefVD) && DefVD->checkInitIsICE(); 48 } 49 50 // Directly mark a variable odr-used. Given a choice, prefer to use 51 // MarkVariableReferenced since it does additional checks and then 52 // calls MarkVarDeclODRUsed. 53 // If the variable must be captured: 54 // - if FunctionScopeIndexToStopAt is null, capture it in the CurContext 55 // - else capture it in the DeclContext that maps to the 56 // *FunctionScopeIndexToStopAt on the FunctionScopeInfo stack. 57 inline void MarkVarDeclODRUsed(VarDecl *Var, 58 SourceLocation Loc, Sema &SemaRef, 59 const unsigned *const FunctionScopeIndexToStopAt) { 60 // Keep track of used but undefined variables. 61 // FIXME: We shouldn't suppress this warning for static data members. 62 if (Var->hasDefinition(SemaRef.Context) == VarDecl::DeclarationOnly && 63 !Var->isExternallyVisible() && 64 !(Var->isStaticDataMember() && Var->hasInit())) { 65 SourceLocation &old = SemaRef.UndefinedButUsed[Var->getCanonicalDecl()]; 66 if (old.isInvalid()) old = Loc; 67 } 68 QualType CaptureType, DeclRefType; 69 SemaRef.tryCaptureVariable(Var, Loc, Sema::TryCapture_Implicit, 70 /*EllipsisLoc*/ SourceLocation(), 71 /*BuildAndDiagnose*/ true, 72 CaptureType, DeclRefType, 73 FunctionScopeIndexToStopAt); 74 75 Var->markUsed(SemaRef.Context); 76 } 77 78 /// Return a DLL attribute from the declaration. 79 inline InheritableAttr *getDLLAttr(Decl *D) { 80 assert(!(D->hasAttr<DLLImportAttr>() && D->hasAttr<DLLExportAttr>()) && 81 "A declaration cannot be both dllimport and dllexport."); 82 if (auto *Import = D->getAttr<DLLImportAttr>()) 83 return Import; 84 if (auto *Export = D->getAttr<DLLExportAttr>()) 85 return Export; 86 return nullptr; 87 } 88 89 } 90 91 #endif 92