[PATCH] Fallback to operator new for MSVC compatibility

Aaron Ballman aaron at aaronballman.com
Wed May 29 13:01:46 PDT 2013


On Wed, May 29, 2013 at 3:55 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Wed, May 29, 2013 at 7:49 AM, Aaron Ballman <aaron at aaronballman.com>
> wrote:
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>>
>> struct arbitrary_t {} arbitrary;
>>
>> void *operator new[]( size_t s, arbitrary_t ) throw() { return ::malloc( s
>> ); }
>>
>> struct S {
>>   void *operator new( size_t s, arbitrary_t ) throw() { return ::malloc( s
>> ); }
>> };
>>
>> int main() {
>>   S *s = new (arbitrary) S[2];
>> }
>>
>> This will yield a call to the global operator new[] instead of the
>> class-specific operator new.  Using new instead of new[] yields a call
>> to the matching class-specific operator new still.  So I think my test
>> will have to move down below the check for a global operator new:
>>
>>  <look for member operator new>
>>  <look for global operator new>
>> +if (not found && looking for array new && MS mode)
>> +  <switch to looking for non-array new>
>> +  <look for global operator new>
>>
>> If you agree, then I'll make the changes and add another test to
>> CodeGenCXX to ensure we're calling the proper one.
>
>
> What happens if you remove the global array new? Is the class-specific
> non-array new used then?

You get an error:

F:\Aaron Ballman\Desktop\test6.cpp(13) : error C2660: 'operator new' : function
does not take 2 arguments

~Aaron



More information about the cfe-commits mailing list