Sent from my iPhone

On Oct 2, 2011, at 3:47 AM, Sebastian Redl <[email protected]> 
wrote:

> On 09/26/2011 04:58 PM, Douglas Gregor wrote:
>> On Sep 24, 2011, at 10:48 AM, Sebastian Redl wrote:
>> 
>>> Author: cornedbee
>>> Date: Sat Sep 24 12:48:00 2011
>>> New Revision: 140457
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=140457&view=rev
>>> Log:
>>> Give InitListChecker a verification-only mode, where it neither emits 
>>> diagnostics nor
>>> builds a semantic (structured) initializer list, just reports on whether it 
>>> can match
>>> the given list to the target type.
>>> Use this mode for doing init list checking in the initial step of 
>>> initialization, which
>>> will eventually allow us to do overload resolution based on the outcome.
>> Cool. Comments below.
>> 
>>>   // @brief Retrieves the fully-structured initializer list used for
>>> @@ -450,8 +451,9 @@
>>> 
>>> 
>>> InitListChecker::InitListChecker(Sema&S, const InitializedEntity&Entity,
>>> -                                 InitListExpr *IL, QualType&T)
>>> -  : SemaRef(S) {
>>> +                                 InitListExpr *IL, QualType&T,
>>> +                                 bool VerifyOnly)
>>> +  : SemaRef(S), VerifyOnly(VerifyOnly) {
>>>   hadError = false;
>>> 
>>>   unsigned newIndex = 0;
>>> @@ -462,7 +464,7 @@
>>>                         FullyStructuredList, newStructuredIndex,
>>>                         /*TopLevelObject=*/true);
>>> 
>>> -  if (!hadError) {
>>> +  if (!hadError&&  !VerifyOnly) {
>>>     bool RequiresSecondPass = false;
>>>     FillInValueInitializations(Entity, FullyStructuredList, 
>>> RequiresSecondPass);
>> It seems like we do still need to check the value initializations (to make 
>> sure there is a suitable default constructor for members that haven't been 
>> initialized), although we don't want to build anything.
>> 
> It turns out this is much harder than expected. I cannot just extend the 
> verify-only mode to FillInValueInitializers because it is built with the 
> assumption of having a fully structured init list to traverse.
> It's reasonably easy to check value initialization for entries left out at 
> the end of the init list during the primary checker run, i.e.
> NoDefaultCtor array[2] = { 1 };
> But without the structured initializer list, I have no idea how to find holes 
> left by designated initializers, i.e.
> NoDefaultCtor array{2] = { [1] = 1 };

That is tricky. I don't see any solution that doesn't involve building the 
structured init list (or something like it), but we really don't want to burn 
memory on building the structured init list twice. 
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to