Author: aaronballman Date: Sun Feb 25 12:40:06 2018 New Revision: 326058 URL: http://llvm.org/viewvc/llvm-project?rev=326058&view=rev Log: 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. Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp cfe/trunk/test/Sema/alloc-size.c Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=326058&r1=326057&r2=326058&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Sun Feb 25 12:40:06 2018 @@ -765,19 +765,19 @@ static void handleAssertExclusiveLockAtt 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 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, 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, /*Index=*/2)) return; - if (!checkParamIsIntegerType(S, FD, AL, NumberArgNo, /*AttrArgNo=*/1)) + if (!checkParamIsIntegerType(S, FD, AL, /*AttrArgNo=*/1)) return; } Modified: cfe/trunk/test/Sema/alloc-size.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/alloc-size.c?rev=326058&r1=326057&r2=326058&view=diff ============================================================================== --- cfe/trunk/test/Sema/alloc-size.c (original) +++ cfe/trunk/test/Sema/alloc-size.c Sun Feb 25 12:40:06 2018 @@ -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}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits