r278471 - [Sema] Fix a crash on variadic enable_if functions.

George Burgess IV via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 11 22:19:50 PDT 2016


r278479.

Thank you! :)

On Thu, Aug 11, 2016 at 10:08 PM, Richard Smith <richard at metafoo.co.uk>
wrote:

> Sure, looks safe enough to me.
>
> On 11 Aug 2016 9:23 p.m., "George Burgess IV" <george.burgess.iv at gmail.com>
> wrote:
>
> Hi Richard,
>
> Would you mind if I merged this into the 3.9 branch? :)
>
> Thanks,
> George
>
> On Thu, Aug 11, 2016 at 9:12 PM, George Burgess IV via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: gbiv
>> Date: Thu Aug 11 23:12:31 2016
>> New Revision: 278471
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=278471&view=rev
>> Log:
>> [Sema] Fix a crash on variadic enable_if functions.
>>
>> Currently, when trying to evaluate an enable_if condition, we try to
>> evaluate all arguments a user passes to a function. Given that we can't
>> use variadic arguments from said condition anyway, not converting them
>> is a reasonable thing to do. So, this patch makes us ignore any varargs
>> when attempting to check an enable_if condition.
>>
>> We'd crash because, in order to convert an argument, we need its
>> ParmVarDecl. Variadic arguments don't have ParmVarDecls.
>>
>> Modified:
>>     cfe/trunk/lib/Sema/SemaOverload.cpp
>>     cfe/trunk/test/Sema/enable_if.c
>>     cfe/trunk/test/SemaCXX/enable_if.cpp
>>
>> Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaO
>> verload.cpp?rev=278471&r1=278470&r2=278471&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaOverload.cpp Thu Aug 11 23:12:31 2016
>> @@ -5974,8 +5974,12 @@ EnableIfAttr *Sema::CheckEnableIf(Functi
>>    SmallVector<Expr *, 16> ConvertedArgs;
>>    bool InitializationFailed = false;
>>
>> +  // Ignore any variadic parameters. Converting them is pointless, since
>> the
>> +  // user can't refer to them in the enable_if condition.
>> +  unsigned ArgSizeNoVarargs = std::min(Function->param_size(),
>> Args.size());
>> +
>>    // Convert the arguments.
>> -  for (unsigned I = 0, E = Args.size(); I != E; ++I) {
>> +  for (unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
>>      ExprResult R;
>>      if (I == 0 && !MissingImplicitThis && isa<CXXMethodDecl>(Function) &&
>>          !cast<CXXMethodDecl>(Function)->isStatic() &&
>>
>> Modified: cfe/trunk/test/Sema/enable_if.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/enab
>> le_if.c?rev=278471&r1=278470&r2=278471&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/test/Sema/enable_if.c (original)
>> +++ cfe/trunk/test/Sema/enable_if.c Thu Aug 11 23:12:31 2016
>> @@ -149,4 +149,25 @@ void PR27122_ext() {
>>    regular_enable_if(1, 2); // expected-error{{too many arguments}}
>>    regular_enable_if(); // expected-error{{too few arguments}}
>>  }
>> +
>> +// We had a bug where we'd crash upon trying to evaluate varargs.
>> +void variadic_enable_if(int a, ...) __attribute__((enable_if(a, "")));
>> // expected-note 6 {{disabled}}
>> +void variadic_test() {
>> +  variadic_enable_if(1);
>> +  variadic_enable_if(1, 2);
>> +  variadic_enable_if(1, "c", 3);
>> +
>> +  variadic_enable_if(0); // expected-error{{no matching}}
>> +  variadic_enable_if(0, 2); // expected-error{{no matching}}
>> +  variadic_enable_if(0, "c", 3); // expected-error{{no matching}}
>> +
>> +  int m;
>> +  variadic_enable_if(1);
>> +  variadic_enable_if(1, m);
>> +  variadic_enable_if(1, m, "c");
>> +
>> +  variadic_enable_if(0); // expected-error{{no matching}}
>> +  variadic_enable_if(0, m); // expected-error{{no matching}}
>> +  variadic_enable_if(0, m, 3); // expected-error{{no matching}}
>> +}
>>  #endif
>>
>> Modified: cfe/trunk/test/SemaCXX/enable_if.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/e
>> nable_if.cpp?rev=278471&r1=278470&r2=278471&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/test/SemaCXX/enable_if.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/enable_if.cpp Thu Aug 11 23:12:31 2016
>> @@ -417,3 +417,26 @@ template <int N> constexpr int callTempl
>>  constexpr int B = callTemplated<0>(); // expected-error{{initialized by
>> a constant expression}} expected-error at -2{{no matching function for call
>> to 'templated'}} expected-note{{in instantiation of function template}}
>> expected-note at -9{{candidate disabled}}
>>  static_assert(callTemplated<1>() == 1, "");
>>  }
>> +
>> +namespace variadic {
>> +void foo(int a, int b = 0, ...) __attribute__((enable_if(a && b, "")));
>> // expected-note 6{{disabled}}
>> +
>> +void testFoo() {
>> +  foo(1, 1);
>> +  foo(1, 1, 2);
>> +  foo(1, 1, 2, 3);
>> +
>> +  foo(1, 0); // expected-error{{no matching}}
>> +  foo(1, 0, 2); // expected-error{{no matching}}
>> +  foo(1, 0, 2, 3); // expected-error{{no matching}}
>> +
>> +  int m;
>> +  foo(1, 1);
>> +  foo(1, 1, m);
>> +  foo(1, 1, m, 3);
>> +
>> +  foo(1, 0); // expected-error{{no matching}}
>> +  foo(1, 0, m); // expected-error{{no matching}}
>> +  foo(1, 0, m, 3); // expected-error{{no matching}}
>> +}
>> +}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160811/f910dc18/attachment.html>


More information about the cfe-commits mailing list