From: Aaron Ballman Date: Sun, 25 Feb 2018 20:28:10 +0000 (+0000) Subject: Fix a failing assertion with the pointer_with_type_tag attribute when the function... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6f7238f35a974f843d3cbb2fe1740ce09f640db7;p=clang Fix a failing assertion with the pointer_with_type_tag attribute when the function the attribute appertains to is variadic. Patch by Joel Denny. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326057 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 4247b32a67..dea16f9f7c 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -4567,11 +4567,10 @@ static void handleArgumentWithTypeTagAttr(Sema &S, Decl *D, bool IsPointer = AL.getName()->getName() == "pointer_with_type_tag"; if (IsPointer) { // Ensure that buffer has a pointer type. - QualType BufferTy = getFunctionOrMethodParamType(D, ArgumentIdx); - if (!BufferTy->isPointerType()) { + if (ArgumentIdx >= getFunctionOrMethodNumParams(D) || + !getFunctionOrMethodParamType(D, ArgumentIdx)->isPointerType()) S.Diag(AL.getLoc(), diag::err_attribute_pointers_only) - << AL.getName() << 0; - } + << AL.getName() << 0; } D->addAttr(::new (S.Context) ArgumentWithTypeTagAttr( diff --git a/test/Sema/warn-type-safety.c b/test/Sema/warn-type-safety.c index 36fb47e254..da914730d3 100644 --- a/test/Sema/warn-type-safety.c +++ b/test/Sema/warn-type-safety.c @@ -37,6 +37,10 @@ int wrong9 __attribute__(( pointer_with_type_tag(mpi,1,2) )); // expected-error int wrong10(double buf, MPI_Datatype type) __attribute__(( pointer_with_type_tag(mpi,1,2) )); // expected-error {{'pointer_with_type_tag' attribute only applies to pointer arguments}} +int ok11(void *, ...) + __attribute__(( pointer_with_type_tag(mpi,1,2) )); +int wrong11(void *, ...) + __attribute__(( pointer_with_type_tag(mpi,2,3) )); // expected-error {{'pointer_with_type_tag' attribute only applies to pointer arguments}} extern struct A datatype_wrong1 __attribute__(( type_tag_for_datatype )); // expected-error {{'type_tag_for_datatype' attribute requires parameter 1 to be an identifier}}