diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 20:45:01 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 20:45:01 +0000 | 
| commit | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (patch) | |
| tree | 4adf86a776049cbf7f69a1929c4babcbbef925eb /clang/lib/AST/Decl.cpp | |
| parent | 7cc9cf2bf09f069cb2dd947ead05d0b54301fb71 (diff) | |
Notes
Diffstat (limited to 'clang/lib/AST/Decl.cpp')
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 170 | 
1 files changed, 127 insertions, 43 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 80235d8496d2..0d30f64b992e 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -16,6 +16,7 @@  #include "clang/AST/ASTDiagnostic.h"  #include "clang/AST/ASTLambda.h"  #include "clang/AST/ASTMutationListener.h" +#include "clang/AST/Attr.h"  #include "clang/AST/CanonicalType.h"  #include "clang/AST/DeclBase.h"  #include "clang/AST/DeclCXX.h" @@ -55,8 +56,8 @@  #include "llvm/ADT/Optional.h"  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/StringSwitch.h"  #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringSwitch.h"  #include "llvm/ADT/Triple.h"  #include "llvm/Support/Casting.h"  #include "llvm/Support/ErrorHandling.h" @@ -901,6 +902,10 @@ LinkageComputer::getLVForNamespaceScopeDecl(const NamedDecl *D,    if (!isExternallyVisible(LV.getLinkage()))      return LinkageInfo(LV.getLinkage(), DefaultVisibility, false); +  // Mark the symbols as hidden when compiling for the device. +  if (Context.getLangOpts().OpenMP && Context.getLangOpts().OpenMPIsDevice) +    LV.mergeVisibility(HiddenVisibility, /*newExplicit=*/false); +    return LV;  } @@ -1815,6 +1820,12 @@ SourceLocation DeclaratorDecl::getTypeSpecStartLoc() const {    return SourceLocation();  } +SourceLocation DeclaratorDecl::getTypeSpecEndLoc() const { +  TypeSourceInfo *TSI = getTypeSourceInfo(); +  if (TSI) return TSI->getTypeLoc().getEndLoc(); +  return SourceLocation(); +} +  void DeclaratorDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) {    if (QualifierLoc) {      // Make sure the extended decl info is allocated. @@ -1828,23 +1839,27 @@ void DeclaratorDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) {      }      // Set qualifier info.      getExtInfo()->QualifierLoc = QualifierLoc; -  } else { +  } else if (hasExtInfo()) {      // Here Qualifier == 0, i.e., we are removing the qualifier (if any). -    if (hasExtInfo()) { -      if (getExtInfo()->NumTemplParamLists == 0) { -        // Save type source info pointer. -        TypeSourceInfo *savedTInfo = getExtInfo()->TInfo; -        // Deallocate the extended decl info. -        getASTContext().Deallocate(getExtInfo()); -        // Restore savedTInfo into (non-extended) decl info. -        DeclInfo = savedTInfo; -      } -      else -        getExtInfo()->QualifierLoc = QualifierLoc; -    } +    getExtInfo()->QualifierLoc = QualifierLoc;    }  } +void DeclaratorDecl::setTrailingRequiresClause(Expr *TrailingRequiresClause) { +  assert(TrailingRequiresClause); +  // Make sure the extended decl info is allocated. +  if (!hasExtInfo()) { +    // Save (non-extended) type source info pointer. +    auto *savedTInfo = DeclInfo.get<TypeSourceInfo*>(); +    // Allocate external info struct. +    DeclInfo = new (getASTContext()) ExtInfo; +    // Restore savedTInfo into (extended) decl info. +    getExtInfo()->TInfo = savedTInfo; +  } +  // Set requires clause info. +  getExtInfo()->TrailingRequiresClause = TrailingRequiresClause; +} +  void DeclaratorDecl::setTemplateParameterListsInfo(      ASTContext &Context, ArrayRef<TemplateParameterList *> TPLists) {    assert(!TPLists.empty()); @@ -2766,10 +2781,11 @@ FunctionDecl::FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC,                             const DeclarationNameInfo &NameInfo, QualType T,                             TypeSourceInfo *TInfo, StorageClass S,                             bool isInlineSpecified, -                           ConstexprSpecKind ConstexprKind) +                           ConstexprSpecKind ConstexprKind, +                           Expr *TrailingRequiresClause)      : DeclaratorDecl(DK, DC, NameInfo.getLoc(), NameInfo.getName(), T, TInfo,                       StartLoc), -      DeclContext(DK), redeclarable_base(C), ODRHash(0), +      DeclContext(DK), redeclarable_base(C), Body(), ODRHash(0),        EndRangeLoc(NameInfo.getEndLoc()), DNLoc(NameInfo.getInfo()) {    assert(T.isNull() || T->isFunctionType());    FunctionDeclBits.SClass = S; @@ -2784,16 +2800,20 @@ FunctionDecl::FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC,    FunctionDeclBits.IsTrivialForCall = false;    FunctionDeclBits.IsDefaulted = false;    FunctionDeclBits.IsExplicitlyDefaulted = false; +  FunctionDeclBits.HasDefaultedFunctionInfo = false;    FunctionDeclBits.HasImplicitReturnZero = false;    FunctionDeclBits.IsLateTemplateParsed = false;    FunctionDeclBits.ConstexprKind = ConstexprKind;    FunctionDeclBits.InstantiationIsPending = false;    FunctionDeclBits.UsesSEHTry = false; +  FunctionDeclBits.UsesFPIntrin = false;    FunctionDeclBits.HasSkippedBody = false;    FunctionDeclBits.WillHaveBody = false;    FunctionDeclBits.IsMultiVersion = false;    FunctionDeclBits.IsCopyDeductionCandidate = false;    FunctionDeclBits.HasODRHash = false; +  if (TrailingRequiresClause) +    setTrailingRequiresClause(TrailingRequiresClause);  }  void FunctionDecl::getNameForDiagnostic( @@ -2810,6 +2830,32 @@ bool FunctionDecl::isVariadic() const {    return false;  } +FunctionDecl::DefaultedFunctionInfo * +FunctionDecl::DefaultedFunctionInfo::Create(ASTContext &Context, +                                            ArrayRef<DeclAccessPair> Lookups) { +  DefaultedFunctionInfo *Info = new (Context.Allocate( +      totalSizeToAlloc<DeclAccessPair>(Lookups.size()), +      std::max(alignof(DefaultedFunctionInfo), alignof(DeclAccessPair)))) +      DefaultedFunctionInfo; +  Info->NumLookups = Lookups.size(); +  std::uninitialized_copy(Lookups.begin(), Lookups.end(), +                          Info->getTrailingObjects<DeclAccessPair>()); +  return Info; +} + +void FunctionDecl::setDefaultedFunctionInfo(DefaultedFunctionInfo *Info) { +  assert(!FunctionDeclBits.HasDefaultedFunctionInfo && "already have this"); +  assert(!Body && "can't replace function body with defaulted function info"); + +  FunctionDeclBits.HasDefaultedFunctionInfo = true; +  DefaultedInfo = Info; +} + +FunctionDecl::DefaultedFunctionInfo * +FunctionDecl::getDefaultedFunctionInfo() const { +  return FunctionDeclBits.HasDefaultedFunctionInfo ? DefaultedInfo : nullptr; +} +  bool FunctionDecl::hasBody(const FunctionDecl *&Definition) const {    for (auto I : redecls()) {      if (I->doesThisDeclarationHaveABody()) { @@ -2821,8 +2867,7 @@ bool FunctionDecl::hasBody(const FunctionDecl *&Definition) const {    return false;  } -bool FunctionDecl::hasTrivialBody() const -{ +bool FunctionDecl::hasTrivialBody() const {    Stmt *S = getBody();    if (!S) {      // Since we don't have a body for this function, we don't know if it's @@ -2850,6 +2895,8 @@ Stmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {    if (!hasBody(Definition))      return nullptr; +  assert(!Definition->FunctionDeclBits.HasDefaultedFunctionInfo && +         "definition should not have a body");    if (Definition->Body)      return Definition->Body.get(getASTContext().getExternalSource()); @@ -2857,7 +2904,8 @@ Stmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {  }  void FunctionDecl::setBody(Stmt *B) { -  Body = B; +  FunctionDeclBits.HasDefaultedFunctionInfo = false; +  Body = LazyDeclStmtPtr(B);    if (B)      EndRangeLoc = B->getEndLoc();  } @@ -2998,6 +3046,14 @@ bool FunctionDecl::isReplaceableGlobalAllocationFunction(bool *IsAligned) const    return Params == FPT->getNumParams();  } +bool FunctionDecl::isInlineBuiltinDeclaration() const { +  if (!getBuiltinID()) +    return false; + +  const FunctionDecl *Definition; +  return hasBody(Definition) && Definition->isInlineSpecified(); +} +  bool FunctionDecl::isDestroyingOperatorDelete() const {    // C++ P0722:    //   Within a class C, a single object deallocation function with signature @@ -3115,10 +3171,17 @@ FunctionDecl *FunctionDecl::getCanonicalDecl() { return getFirstDecl(); }  /// functions as their wrapped builtins. This shouldn't be done in general, but  /// it's useful in Sema to diagnose calls to wrappers based on their semantics.  unsigned FunctionDecl::getBuiltinID(bool ConsiderWrapperFunctions) const { -  if (!getIdentifier()) -    return 0; +  unsigned BuiltinID; + +  if (const auto *AMAA = getAttr<ArmMveAliasAttr>()) { +    BuiltinID = AMAA->getBuiltinName()->getBuiltinID(); +  } else { +    if (!getIdentifier()) +      return 0; + +    BuiltinID = getIdentifier()->getBuiltinID(); +  } -  unsigned BuiltinID = getIdentifier()->getBuiltinID();    if (!BuiltinID)      return 0; @@ -3142,7 +3205,8 @@ unsigned FunctionDecl::getBuiltinID(bool ConsiderWrapperFunctions) const {    // If the function is marked "overloadable", it has a different mangled name    // and is not the C library function. -  if (!ConsiderWrapperFunctions && hasAttr<OverloadableAttr>()) +  if (!ConsiderWrapperFunctions && hasAttr<OverloadableAttr>() && +      !hasAttr<ArmMveAliasAttr>())      return 0;    if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) @@ -3290,9 +3354,9 @@ bool FunctionDecl::doesDeclarationForceExternallyVisibleDefinition() const {      const FunctionDecl *Prev = this;      bool FoundBody = false;      while ((Prev = Prev->getPreviousDecl())) { -      FoundBody |= Prev->Body.isValid(); +      FoundBody |= Prev->doesThisDeclarationHaveABody(); -      if (Prev->Body) { +      if (Prev->doesThisDeclarationHaveABody()) {          // If it's not the case that both 'inline' and 'extern' are          // specified on the definition, then it is always externally visible.          if (!Prev->isInlineSpecified() || @@ -3315,19 +3379,21 @@ bool FunctionDecl::doesDeclarationForceExternallyVisibleDefinition() const {    const FunctionDecl *Prev = this;    bool FoundBody = false;    while ((Prev = Prev->getPreviousDecl())) { -    FoundBody |= Prev->Body.isValid(); +    FoundBody |= Prev->doesThisDeclarationHaveABody();      if (RedeclForcesDefC99(Prev))        return false;    }    return FoundBody;  } -SourceRange FunctionDecl::getReturnTypeSourceRange() const { +FunctionTypeLoc FunctionDecl::getFunctionTypeLoc() const {    const TypeSourceInfo *TSI = getTypeSourceInfo(); -  if (!TSI) -    return SourceRange(); -  FunctionTypeLoc FTL = -      TSI->getTypeLoc().IgnoreParens().getAs<FunctionTypeLoc>(); +  return TSI ? TSI->getTypeLoc().IgnoreParens().getAs<FunctionTypeLoc>() +             : FunctionTypeLoc(); +} + +SourceRange FunctionDecl::getReturnTypeSourceRange() const { +  FunctionTypeLoc FTL = getFunctionTypeLoc();    if (!FTL)      return SourceRange(); @@ -3342,16 +3408,25 @@ SourceRange FunctionDecl::getReturnTypeSourceRange() const {    return RTRange;  } -SourceRange FunctionDecl::getExceptionSpecSourceRange() const { -  const TypeSourceInfo *TSI = getTypeSourceInfo(); -  if (!TSI) -    return SourceRange(); -  FunctionTypeLoc FTL = -    TSI->getTypeLoc().IgnoreParens().getAs<FunctionTypeLoc>(); -  if (!FTL) +SourceRange FunctionDecl::getParametersSourceRange() const { +  unsigned NP = getNumParams(); +  SourceLocation EllipsisLoc = getEllipsisLoc(); + +  if (NP == 0 && EllipsisLoc.isInvalid())      return SourceRange(); -  return FTL.getExceptionSpecRange(); +  SourceLocation Begin = +      NP > 0 ? ParamInfo[0]->getSourceRange().getBegin() : EllipsisLoc; +  SourceLocation End = EllipsisLoc.isValid() +                           ? EllipsisLoc +                           : ParamInfo[NP - 1]->getSourceRange().getEnd(); + +  return SourceRange(Begin, End); +} + +SourceRange FunctionDecl::getExceptionSpecSourceRange() const { +  FunctionTypeLoc FTL = getFunctionTypeLoc(); +  return FTL ? FTL.getExceptionSpecRange() : SourceRange();  }  /// For an inline function definition in C, or for a gnu_inline function @@ -3812,6 +3887,11 @@ unsigned FunctionDecl::getMemoryFunctionKind() const {    case Builtin::BImemcpy:      return Builtin::BImemcpy; +  case Builtin::BI__builtin_mempcpy: +  case Builtin::BI__builtin___mempcpy_chk: +  case Builtin::BImempcpy: +    return Builtin::BImempcpy; +    case Builtin::BI__builtin_memmove:    case Builtin::BI__builtin___memmove_chk:    case Builtin::BImemmove: @@ -3869,6 +3949,8 @@ unsigned FunctionDecl::getMemoryFunctionKind() const {          return Builtin::BImemset;        else if (FnInfo->isStr("memcpy"))          return Builtin::BImemcpy; +      else if (FnInfo->isStr("mempcpy")) +        return Builtin::BImempcpy;        else if (FnInfo->isStr("memmove"))          return Builtin::BImemmove;        else if (FnInfo->isStr("memcmp")) @@ -4582,7 +4664,7 @@ LabelDecl *LabelDecl::CreateDeserialized(ASTContext &C, unsigned ID) {  }  void LabelDecl::setMSAsmLabel(StringRef Name) { -  char *Buffer = new (getASTContext(), 1) char[Name.size() + 1]; +char *Buffer = new (getASTContext(), 1) char[Name.size() + 1];    memcpy(Buffer, Name.data(), Name.size());    Buffer[Name.size()] = '\0';    MSAsmName = Buffer; @@ -4623,10 +4705,12 @@ FunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC,                                     QualType T, TypeSourceInfo *TInfo,                                     StorageClass SC, bool isInlineSpecified,                                     bool hasWrittenPrototype, -                                   ConstexprSpecKind ConstexprKind) { +                                   ConstexprSpecKind ConstexprKind, +                                   Expr *TrailingRequiresClause) {    FunctionDecl *New =        new (C, DC) FunctionDecl(Function, C, DC, StartLoc, NameInfo, T, TInfo, -                               SC, isInlineSpecified, ConstexprKind); +                               SC, isInlineSpecified, ConstexprKind, +                               TrailingRequiresClause);    New->setHasWrittenPrototype(hasWrittenPrototype);    return New;  } @@ -4634,7 +4718,7 @@ FunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC,  FunctionDecl *FunctionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {    return new (C, ID) FunctionDecl(Function, C, nullptr, SourceLocation(),                                    DeclarationNameInfo(), QualType(), nullptr, -                                  SC_None, false, CSK_unspecified); +                                  SC_None, false, CSK_unspecified, nullptr);  }  BlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) {  | 
