diff options
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 11 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaCodeComplete.cpp | 18 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaFunctionEffects.cpp | 20 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaType.cpp | 38 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaX86.cpp | 17 | 
6 files changed, 68 insertions, 42 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index f451787..ad2c2e4 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -3542,9 +3542,7 @@ bool Sema::ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum) {  bool Sema::getFormatStringInfo(const Decl *D, unsigned FormatIdx,                                 unsigned FirstArg, FormatStringInfo *FSI) { -  bool IsCXXMember = false; -  if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) -    IsCXXMember = MD->isInstance(); +  bool HasImplicitThisParam = hasImplicitObjectParameter(D);    bool IsVariadic = false;    if (const FunctionType *FnTy = D->getFunctionType())      IsVariadic = cast<FunctionProtoType>(FnTy)->isVariadic(); @@ -3553,11 +3551,12 @@ bool Sema::getFormatStringInfo(const Decl *D, unsigned FormatIdx,    else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(D))      IsVariadic = OMD->isVariadic(); -  return getFormatStringInfo(FormatIdx, FirstArg, IsCXXMember, IsVariadic, FSI); +  return getFormatStringInfo(FormatIdx, FirstArg, HasImplicitThisParam, +                             IsVariadic, FSI);  }  bool Sema::getFormatStringInfo(unsigned FormatIdx, unsigned FirstArg, -                               bool IsCXXMember, bool IsVariadic, +                               bool HasImplicitThisParam, bool IsVariadic,                                 FormatStringInfo *FSI) {    if (FirstArg == 0)      FSI->ArgPassingKind = FAPK_VAList; @@ -3571,7 +3570,7 @@ bool Sema::getFormatStringInfo(unsigned FormatIdx, unsigned FirstArg,    // The way the format attribute works in GCC, the implicit this argument    // of member functions is counted. However, it doesn't appear in our own    // lists, so decrement format_idx in that case. -  if (IsCXXMember) { +  if (HasImplicitThisParam) {      if(FSI->FormatIdx == 0)        return false;      --FSI->FormatIdx; diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 0514d10..aa93507 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -10208,6 +10208,24 @@ void SemaCodeCompletion::CodeCompletePreprocessorDirective(bool InConditional) {    Builder.AddPlaceholderChunk("message");    Results.AddResult(Builder.TakeString()); +  if (getLangOpts().C23) { +    // #embed "file" +    Builder.AddTypedTextChunk("embed"); +    Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); +    Builder.AddTextChunk("\""); +    Builder.AddPlaceholderChunk("file"); +    Builder.AddTextChunk("\""); +    Results.AddResult(Builder.TakeString()); + +    // #embed <file> +    Builder.AddTypedTextChunk("embed"); +    Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); +    Builder.AddTextChunk("<"); +    Builder.AddPlaceholderChunk("file"); +    Builder.AddTextChunk(">"); +    Results.AddResult(Builder.TakeString()); +  } +    // Note: #ident and #sccs are such crazy anachronisms that we don't provide    // completions for them. And __include_macros is a Clang-internal extension    // that we don't want to encourage anyone to use. diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 964a2a7..a9e7b44 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3785,7 +3785,7 @@ static bool handleFormatAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL,    // In C++ the implicit 'this' function parameter also counts, and they are    // counted from one. -  bool HasImplicitThisParam = isInstanceMethod(D); +  bool HasImplicitThisParam = hasImplicitObjectParameter(D);    Info->NumArgs = getFunctionOrMethodNumParams(D) + HasImplicitThisParam;    Info->Identifier = AL.getArgAsIdent(0)->getIdentifierInfo(); @@ -3926,7 +3926,7 @@ static void handleCallbackAttr(Sema &S, Decl *D, const ParsedAttr &AL) {      return;    } -  bool HasImplicitThisParam = isInstanceMethod(D); +  bool HasImplicitThisParam = hasImplicitObjectParameter(D);    int32_t NumArgs = getFunctionOrMethodNumParams(D);    FunctionDecl *FD = D->getAsFunction(); @@ -4110,7 +4110,7 @@ static void handleLifetimeCaptureByAttr(Sema &S, Decl *D,  }  void Sema::LazyProcessLifetimeCaptureByParams(FunctionDecl *FD) { -  bool HasImplicitThisParam = isInstanceMethod(FD); +  bool HasImplicitThisParam = hasImplicitObjectParameter(FD);    SmallVector<LifetimeCaptureByAttr *, 1> Attrs;    for (ParmVarDecl *PVD : FD->parameters())      if (auto *A = PVD->getAttr<LifetimeCaptureByAttr>()) diff --git a/clang/lib/Sema/SemaFunctionEffects.cpp b/clang/lib/Sema/SemaFunctionEffects.cpp index 8590ee8..4b63eb7 100644 --- a/clang/lib/Sema/SemaFunctionEffects.cpp +++ b/clang/lib/Sema/SemaFunctionEffects.cpp @@ -1208,8 +1208,16 @@ private:          return true;        } -      // No Decl, just an Expr. Just check based on its type. -      checkIndirectCall(Call, CalleeExpr->getType()); +      // No Decl, just an Expr. Just check based on its type. Bound member +      // functions are a special expression type and need to be specially +      // unpacked. +      QualType CalleeExprQT = CalleeExpr->getType(); +      if (CalleeExpr->isBoundMemberFunction(Outer.S.getASTContext())) { +        QualType QT = Expr::findBoundMemberType(CalleeExpr); +        if (!QT.isNull()) +          CalleeExprQT = QT; +      } +      checkIndirectCall(Call, CalleeExprQT);        return true;      } @@ -1271,7 +1279,15 @@ private:        const CXXConstructorDecl *Ctor = Construct->getConstructor();        CallableInfo CI(*Ctor);        followCall(CI, Construct->getLocation()); +      return true; +    } +    bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *BTE) override { +      const CXXDestructorDecl *Dtor = BTE->getTemporary()->getDestructor(); +      if (Dtor != nullptr) { +        CallableInfo CI(*Dtor); +        followCall(CI, BTE->getBeginLoc()); +      }        return true;      } diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 280b3c9..c483930 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -2358,6 +2358,11 @@ QualType Sema::BuildVectorType(QualType CurType, Expr *SizeExpr,      return QualType();    } +  if (VecSize->isNegative()) { +    Diag(SizeExpr->getExprLoc(), diag::err_attribute_vec_negative_size); +    return QualType(); +  } +    if (CurType->isDependentType())      return Context.getDependentVectorType(CurType, SizeExpr, AttrLoc,                                            VectorKind::Generic); @@ -2394,7 +2399,7 @@ QualType Sema::BuildVectorType(QualType CurType, Expr *SizeExpr,                                 VectorKind::Generic);  } -QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize, +QualType Sema::BuildExtVectorType(QualType T, Expr *SizeExpr,                                    SourceLocation AttrLoc) {    // Unlike gcc's vector_size attribute, we do not allow vectors to be defined    // in conjunction with complex types (pointers, arrays, functions, etc.). @@ -2417,35 +2422,40 @@ QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize,        BIT && CheckBitIntElementType(*this, AttrLoc, BIT))      return QualType(); -  if (!ArraySize->isTypeDependent() && !ArraySize->isValueDependent()) { -    std::optional<llvm::APSInt> vecSize = -        ArraySize->getIntegerConstantExpr(Context); -    if (!vecSize) { +  if (!SizeExpr->isTypeDependent() && !SizeExpr->isValueDependent()) { +    std::optional<llvm::APSInt> VecSize = +        SizeExpr->getIntegerConstantExpr(Context); +    if (!VecSize) {        Diag(AttrLoc, diag::err_attribute_argument_type) -        << "ext_vector_type" << AANT_ArgumentIntegerConstant -        << ArraySize->getSourceRange(); +          << "ext_vector_type" << AANT_ArgumentIntegerConstant +          << SizeExpr->getSourceRange(); +      return QualType(); +    } + +    if (VecSize->isNegative()) { +      Diag(SizeExpr->getExprLoc(), diag::err_attribute_vec_negative_size);        return QualType();      } -    if (!vecSize->isIntN(32)) { +    if (!VecSize->isIntN(32)) {        Diag(AttrLoc, diag::err_attribute_size_too_large) -          << ArraySize->getSourceRange() << "vector"; +          << SizeExpr->getSourceRange() << "vector";        return QualType();      }      // Unlike gcc's vector_size attribute, the size is specified as the      // number of elements, not the number of bytes. -    unsigned vectorSize = static_cast<unsigned>(vecSize->getZExtValue()); +    unsigned VectorSize = static_cast<unsigned>(VecSize->getZExtValue()); -    if (vectorSize == 0) { +    if (VectorSize == 0) {        Diag(AttrLoc, diag::err_attribute_zero_size) -          << ArraySize->getSourceRange() << "vector"; +          << SizeExpr->getSourceRange() << "vector";        return QualType();      } -    return Context.getExtVectorType(T, vectorSize); +    return Context.getExtVectorType(T, VectorSize);    } -  return Context.getDependentSizedExtVectorType(T, ArraySize, AttrLoc); +  return Context.getDependentSizedExtVectorType(T, SizeExpr, AttrLoc);  }  QualType Sema::BuildMatrixType(QualType ElementTy, Expr *NumRows, Expr *NumCols, diff --git a/clang/lib/Sema/SemaX86.cpp b/clang/lib/Sema/SemaX86.cpp index 850bcb1..2f61bdd 100644 --- a/clang/lib/Sema/SemaX86.cpp +++ b/clang/lib/Sema/SemaX86.cpp @@ -489,14 +489,6 @@ bool SemaX86::CheckBuiltinTileArguments(unsigned BuiltinID, CallExpr *TheCall) {    case X86::BI__builtin_ia32_tileloaddrst164:    case X86::BI__builtin_ia32_tilestored64:    case X86::BI__builtin_ia32_tilezero: -  case X86::BI__builtin_ia32_t2rpntlvwz0: -  case X86::BI__builtin_ia32_t2rpntlvwz0t1: -  case X86::BI__builtin_ia32_t2rpntlvwz1: -  case X86::BI__builtin_ia32_t2rpntlvwz1t1: -  case X86::BI__builtin_ia32_t2rpntlvwz0rst1: -  case X86::BI__builtin_ia32_t2rpntlvwz1rs: -  case X86::BI__builtin_ia32_t2rpntlvwz1rst1: -  case X86::BI__builtin_ia32_t2rpntlvwz0rs:    case X86::BI__builtin_ia32_tcvtrowps2bf16h:    case X86::BI__builtin_ia32_tcvtrowps2bf16l:    case X86::BI__builtin_ia32_tcvtrowps2phh: @@ -516,17 +508,8 @@ bool SemaX86::CheckBuiltinTileArguments(unsigned BuiltinID, CallExpr *TheCall) {    case X86::BI__builtin_ia32_tdpbhf8ps:    case X86::BI__builtin_ia32_tdphbf8ps:    case X86::BI__builtin_ia32_tdphf8ps: -  case X86::BI__builtin_ia32_ttdpbf16ps: -  case X86::BI__builtin_ia32_ttdpfp16ps: -  case X86::BI__builtin_ia32_ttcmmimfp16ps: -  case X86::BI__builtin_ia32_ttcmmrlfp16ps: -  case X86::BI__builtin_ia32_tconjtcmmimfp16ps:    case X86::BI__builtin_ia32_tmmultf32ps: -  case X86::BI__builtin_ia32_ttmmultf32ps:      return CheckBuiltinTileRangeAndDuplicate(TheCall, {0, 1, 2}); -  case X86::BI__builtin_ia32_ttransposed: -  case X86::BI__builtin_ia32_tconjtfp16: -    return CheckBuiltinTileArgumentsRange(TheCall, {0, 1});    }  }  static bool isX86_32Builtin(unsigned BuiltinID) {  | 
