forked from OSchip/llvm-project
When diagnosing the arguments to alloc_size, report the failing argument using a 1-based index instead of a 0-based index for consistency.
Patch by Joel Denny. llvm-svn: 326058
This commit is contained in:
parent
bd0f656631
commit
836684aff3
|
@ -765,19 +765,19 @@ static void handleAssertExclusiveLockAttr(Sema &S, Decl *D,
|
|||
AL.getAttributeSpellingListIndex()));
|
||||
}
|
||||
|
||||
/// \brief Checks to be sure that the given parameter number is in bounds, and is
|
||||
/// an integral type. Will emit appropriate diagnostics if this returns
|
||||
/// \brief Checks to be sure that the given parameter number is in bounds, and
|
||||
/// is an integral type. Will emit appropriate diagnostics if this returns
|
||||
/// false.
|
||||
///
|
||||
/// FuncParamNo is expected to be from the user, so is base-1. AttrArgNo is used
|
||||
/// to actually retrieve the argument, so it's base-0.
|
||||
/// AttrArgNo is used to actually retrieve the argument, so it's base-0.
|
||||
template <typename AttrInfo>
|
||||
static bool checkParamIsIntegerType(Sema &S, const FunctionDecl *FD,
|
||||
const AttrInfo &AI, Expr *AttrArg,
|
||||
unsigned FuncParamNo, unsigned AttrArgNo,
|
||||
const AttrInfo &AI, unsigned AttrArgNo,
|
||||
bool AllowDependentType = false) {
|
||||
assert(AI.isArgExpr(AttrArgNo) && "Expected expression argument");
|
||||
Expr *AttrArg = AI.getArgAsExpr(AttrArgNo);
|
||||
uint64_t Idx;
|
||||
if (!checkFunctionOrMethodParameterIndex(S, FD, AI, FuncParamNo, AttrArg,
|
||||
if (!checkFunctionOrMethodParameterIndex(S, FD, AI, AttrArgNo + 1, AttrArg,
|
||||
Idx))
|
||||
return false;
|
||||
|
||||
|
@ -793,20 +793,6 @@ static bool checkParamIsIntegerType(Sema &S, const FunctionDecl *FD,
|
|||
return true;
|
||||
}
|
||||
|
||||
/// \brief Checks to be sure that the given parameter number is in bounds, and is
|
||||
/// an integral type. Will emit appropriate diagnostics if this returns false.
|
||||
///
|
||||
/// FuncParamNo is expected to be from the user, so is base-1. AttrArgNo is used
|
||||
/// to actually retrieve the argument, so it's base-0.
|
||||
static bool checkParamIsIntegerType(Sema &S, const FunctionDecl *FD,
|
||||
const AttributeList &AL,
|
||||
unsigned FuncParamNo, unsigned AttrArgNo,
|
||||
bool AllowDependentType = false) {
|
||||
assert(AL.isArgExpr(AttrArgNo) && "Expected expression argument");
|
||||
return checkParamIsIntegerType(S, FD, AL, AL.getArgAsExpr(AttrArgNo),
|
||||
FuncParamNo, AttrArgNo, AllowDependentType);
|
||||
}
|
||||
|
||||
static void handleAllocSizeAttr(Sema &S, Decl *D, const AttributeList &AL) {
|
||||
if (!checkAttributeAtLeastNumArgs(S, AL, 1) ||
|
||||
!checkAttributeAtMostNumArgs(S, AL, 2))
|
||||
|
@ -825,7 +811,7 @@ static void handleAllocSizeAttr(Sema &S, Decl *D, const AttributeList &AL) {
|
|||
if (!checkPositiveIntArgument(S, AL, SizeExpr, SizeArgNo, /*Index=*/1))
|
||||
return;
|
||||
|
||||
if (!checkParamIsIntegerType(S, FD, AL, SizeArgNo, /*AttrArgNo=*/0))
|
||||
if (!checkParamIsIntegerType(S, FD, AL, /*AttrArgNo=*/0))
|
||||
return;
|
||||
|
||||
// Args are 1-indexed, so 0 implies that the arg was not present
|
||||
|
@ -837,7 +823,7 @@ static void handleAllocSizeAttr(Sema &S, Decl *D, const AttributeList &AL) {
|
|||
/*Index=*/2))
|
||||
return;
|
||||
|
||||
if (!checkParamIsIntegerType(S, FD, AL, NumberArgNo, /*AttrArgNo=*/1))
|
||||
if (!checkParamIsIntegerType(S, FD, AL, /*AttrArgNo=*/1))
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,14 +3,14 @@
|
|||
void *fail1(int a) __attribute__((alloc_size)); //expected-error{{'alloc_size' attribute takes at least 1 argument}}
|
||||
void *fail2(int a) __attribute__((alloc_size())); //expected-error{{'alloc_size' attribute takes at least 1 argument}}
|
||||
|
||||
void *fail3(int a) __attribute__((alloc_size(0))); //expected-error{{'alloc_size' attribute parameter 0 is out of bounds}}
|
||||
void *fail4(int a) __attribute__((alloc_size(2))); //expected-error{{'alloc_size' attribute parameter 2 is out of bounds}}
|
||||
void *fail3(int a) __attribute__((alloc_size(0))); //expected-error{{'alloc_size' attribute parameter 1 is out of bounds}}
|
||||
void *fail4(int a) __attribute__((alloc_size(2))); //expected-error{{'alloc_size' attribute parameter 1 is out of bounds}}
|
||||
|
||||
void *fail5(int a, int b) __attribute__((alloc_size(0, 1))); //expected-error{{'alloc_size' attribute parameter 0 is out of bounds}}
|
||||
void *fail6(int a, int b) __attribute__((alloc_size(3, 1))); //expected-error{{'alloc_size' attribute parameter 3 is out of bounds}}
|
||||
void *fail5(int a, int b) __attribute__((alloc_size(0, 1))); //expected-error{{'alloc_size' attribute parameter 1 is out of bounds}}
|
||||
void *fail6(int a, int b) __attribute__((alloc_size(3, 1))); //expected-error{{'alloc_size' attribute parameter 1 is out of bounds}}
|
||||
|
||||
void *fail7(int a, int b) __attribute__((alloc_size(1, 0))); //expected-error{{'alloc_size' attribute parameter 0 is out of bounds}}
|
||||
void *fail8(int a, int b) __attribute__((alloc_size(1, 3))); //expected-error{{'alloc_size' attribute parameter 3 is out of bounds}}
|
||||
void *fail7(int a, int b) __attribute__((alloc_size(1, 0))); //expected-error{{'alloc_size' attribute parameter 2 is out of bounds}}
|
||||
void *fail8(int a, int b) __attribute__((alloc_size(1, 3))); //expected-error{{'alloc_size' attribute parameter 2 is out of bounds}}
|
||||
|
||||
int fail9(int a) __attribute__((alloc_size(1))); //expected-warning{{'alloc_size' attribute only applies to return values that are pointers}}
|
||||
|
||||
|
|
Loading…
Reference in New Issue