aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaFunctionEffects.cpp20
-rw-r--r--clang/lib/Sema/SemaHLSL.cpp57
-rw-r--r--clang/lib/Sema/SemaStmt.cpp3
-rw-r--r--clang/lib/Sema/SemaTemplateDeductionGuide.cpp3
-rw-r--r--clang/lib/Sema/SemaType.cpp38
5 files changed, 92 insertions, 29 deletions
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/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 94a490a..b9707f0 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -2802,6 +2802,23 @@ static bool CheckUnsignedIntRepresentation(Sema *S, SourceLocation Loc,
return false;
}
+static bool CheckExpectedBitWidth(Sema *S, CallExpr *TheCall,
+ unsigned ArgOrdinal, unsigned Width) {
+ QualType ArgTy = TheCall->getArg(0)->getType();
+ if (auto *VTy = ArgTy->getAs<VectorType>())
+ ArgTy = VTy->getElementType();
+ // ensure arg type has expected bit width
+ uint64_t ElementBitCount =
+ S->getASTContext().getTypeSizeInChars(ArgTy).getQuantity() * 8;
+ if (ElementBitCount != Width) {
+ S->Diag(TheCall->getArg(0)->getBeginLoc(),
+ diag::err_integer_incorrect_bit_count)
+ << Width << ElementBitCount;
+ return true;
+ }
+ return false;
+}
+
static void SetElementTypeAsReturnType(Sema *S, CallExpr *TheCall,
QualType ReturnType) {
auto *VecTyA = TheCall->getArg(0)->getType()->getAs<VectorType>();
@@ -2961,24 +2978,16 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
CheckUnsignedIntVecRepresentation))
return true;
- auto *VTy = TheCall->getArg(0)->getType()->getAs<VectorType>();
// ensure arg integers are 32-bits
- uint64_t ElementBitCount = getASTContext()
- .getTypeSizeInChars(VTy->getElementType())
- .getQuantity() *
- 8;
- if (ElementBitCount != 32) {
- SemaRef.Diag(TheCall->getBeginLoc(),
- diag::err_integer_incorrect_bit_count)
- << 32 << ElementBitCount;
+ if (CheckExpectedBitWidth(&SemaRef, TheCall, 0, 32))
return true;
- }
// ensure both args are vectors of total bit size of a multiple of 64
+ auto *VTy = TheCall->getArg(0)->getType()->getAs<VectorType>();
int NumElementsArg = VTy->getNumElements();
if (NumElementsArg != 2 && NumElementsArg != 4) {
SemaRef.Diag(TheCall->getBeginLoc(), diag::err_vector_incorrect_bit_count)
- << 1 /*a multiple of*/ << 64 << NumElementsArg * ElementBitCount;
+ << 1 /*a multiple of*/ << 64 << NumElementsArg * 32;
return true;
}
@@ -3295,7 +3304,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
break;
}
// Note these are llvm builtins that we want to catch invalid intrinsic
- // generation. Normal handling of these builitns will occur elsewhere.
+ // generation. Normal handling of these builtins will occur elsewhere.
case Builtin::BI__builtin_elementwise_bitreverse: {
// does not include a check for number of arguments
// because that is done previously
@@ -3405,6 +3414,30 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
}
break;
}
+ case Builtin::BI__builtin_hlsl_elementwise_f16tof32: {
+ if (SemaRef.checkArgCount(TheCall, 1))
+ return true;
+ if (CheckAllArgTypesAreCorrect(&SemaRef, TheCall,
+ CheckUnsignedIntRepresentation))
+ return true;
+ // ensure arg integers are 32 bits
+ if (CheckExpectedBitWidth(&SemaRef, TheCall, 0, 32))
+ return true;
+ // check it wasn't a bool type
+ QualType ArgTy = TheCall->getArg(0)->getType();
+ if (auto *VTy = ArgTy->getAs<VectorType>())
+ ArgTy = VTy->getElementType();
+ if (ArgTy->isBooleanType()) {
+ SemaRef.Diag(TheCall->getArg(0)->getBeginLoc(),
+ diag::err_builtin_invalid_arg_type)
+ << 1 << /* scalar or vector of */ 5 << /* unsigned int */ 3
+ << /* no fp */ 0 << TheCall->getArg(0)->getType();
+ return true;
+ }
+
+ SetElementTypeAsReturnType(&SemaRef, TheCall, getASTContext().FloatTy);
+ break;
+ }
}
return false;
}
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index f398963..5b3ef1a 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -3281,6 +3281,9 @@ static Scope *FindLabeledBreakContinueScope(Sema &S, Scope *CurScope,
SourceLocation LabelLoc,
bool IsContinue) {
assert(Target && "not a named break/continue?");
+
+ Target->markUsed(S.Context);
+
Scope *Found = nullptr;
for (Scope *Scope = CurScope; Scope; Scope = Scope->getParent()) {
if (Scope->isFunctionScope())
diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
index ad50600..bfcd397 100644
--- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
+++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
@@ -659,7 +659,8 @@ private:
SemaRef, MaterializedTypedefs, NestedPattern,
TransformingOuterPatterns ? &Args : nullptr)
.transform(NewDI);
-
+ if (!NewDI)
+ return nullptr;
// Resolving a wording defect, we also inherit default arguments from the
// constructor.
ExprResult NewDefArg;
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,