[cfe-commits] r140457 - in /cfe/trunk: include/clang/Sema/Initialization.h include/clang/Sema/Overload.h include/clang/Sema/Sema.h lib/Sema/SemaExpr.cpp lib/Sema/SemaInit.cpp lib/Sema/SemaOverload.cpp
Sebastian Redl
sebastian.redl at getdesigned.at
Mon Sep 26 10:45:15 PDT 2011
On 26.09.2011, at 16:58, 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.
>
>>
>> ExprResult PerformImplicitConversion(Expr *From, QualType ToType,
>> AssignmentAction Action,
>> - bool AllowExplicit = false);
>> + bool AllowExplicit = false,
>> + bool Diagnose = true);
>> ExprResult PerformImplicitConversion(Expr *From, QualType ToType,
>> AssignmentAction Action,
>> bool AllowExplicit,
>> - ImplicitConversionSequence& ICS);
>> + ImplicitConversionSequence& ICS,
>> + bool Diagnose = true);
>> ExprResult PerformImplicitConversion(Expr *From, QualType ToType,
>> const ImplicitConversionSequence& ICS,
>> AssignmentAction Action,
>
> Why did you add the Diagnose flag to PerformImplicitConversion? It doesn't seem to be used at all, and probably shouldn't even be there: if the intent is to check whether a conversion would work, wouldn't it be better to make SemaOverload.cpp's TryImplicitConversion available?
It is used in CheckSingleAssignment(). But I didn't know about TryImplicitConversion, and you're right that making it available would be the better choice.
>
>> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=140457&r1=140456&r2=140457&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Sat Sep 24 12:48:00 2011
>> @@ -41,6 +41,20 @@
>> using namespace clang;
>> using namespace sema;
>>
>> +/// \brief Determine whether the use of this declaration is valid, without
>> +/// emitting diagnostics.
>> +bool Sema::CanUseDecl(NamedDecl *D) {
>> + // See if this is an auto-typed variable whose initializer we are parsing.
>> + if (ParsingInitForAutoVars.count(D))
>> + return false;
>> +
>> + // See if this is a deleted function.
>> + if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
>> + if (FD->isDeleted())
>> + return false;
>> + }
>> + return true;
>> +}
>
> This should also check availability, and return false if the declaration is unavailable.
I just extracted the parts of DiagnoseUseOfDecl that returned a hard error, and I thought I had caught everything. Will re-check.
>
>>
>> - 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.
Good point. Ugh!
>> @@ -1511,6 +1597,9 @@
>> if (!KnownField && Field->isAnonymousStructOrUnion()) {
>> if (IndirectFieldDecl *IF =
>> FindIndirectFieldDesignator(*Field, FieldName)) {
>> + // In verify mode, don't modify the original.
>> + if (VerifyOnly)
>> + DIE = CloneDesignatedInitExpr(SemaRef, DIE);
>> ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IF);
>
> It would be a little less wasteful, memory-wise, if we could do the expand + clone in one operation, so that we don't end up making a copy of the DesignatedInitExpr storage and then throwing that memory away when we reallocate.
I'll see what I can do.
Thanks for the review.
Sebastian
More information about the cfe-commits
mailing list