From: Douglas Gregor Date: Sun, 1 Mar 2009 17:12:46 +0000 (+0000) Subject: Fix PR3509 by providing correct starting locations for initializer lists X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed8a93d17b8936dc7978cdc37f3f00fc49d24f71;p=clang Fix PR3509 by providing correct starting locations for initializer lists git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65777 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 5b022217e5..02df9b32fa 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -410,7 +410,7 @@ InitListChecker::InitListChecker(Sema &S, InitListExpr *IL, QualType &T) unsigned newIndex = 0; unsigned newStructuredIndex = 0; FullyStructuredList - = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, SourceRange()); + = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, IL->getSourceRange()); CheckExplicitInitList(IL, T, newIndex, FullyStructuredList, newStructuredIndex, /*TopLevelObject=*/true); @@ -470,7 +470,8 @@ void InitListChecker::CheckImplicitInitList(InitListExpr *ParentIList, InitListExpr *StructuredSubobjectInitList = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, StructuredIndex, - ParentIList->getInit(Index)->getSourceRange()); + SourceRange(ParentIList->getInit(Index)->getSourceRange().getBegin(), + ParentIList->getSourceRange().getEnd())); unsigned StructuredSubobjectInitIndex = 0; // Check the element types and build the structural subobject. @@ -481,7 +482,7 @@ void InitListChecker::CheckImplicitInitList(InitListExpr *ParentIList, TopLevelObject); unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); - // Update the structured sub-object initialize so that it's ending + // Update the structured sub-object initializer so that it's ending // range corresponds with the end of the last initializer it used. if (EndIndex < ParentIList->getNumInits()) { SourceLocation EndLoc @@ -1088,8 +1089,8 @@ InitListChecker::CheckDesignatedInitializer(InitListExpr *IList, // Determine the structural initializer list that corresponds to the // current subobject. StructuredList = IsFirstDesignator? SyntacticToSemantic[IList] - : getStructuredSubobjectInit(IList, Index, CurrentObjectType, StructuredList, - StructuredIndex, + : getStructuredSubobjectInit(IList, Index, CurrentObjectType, + StructuredList, StructuredIndex, SourceRange(D->getStartLocation(), DIE->getSourceRange().getEnd())); assert(StructuredList && "Expected a structured initializer list"); @@ -1421,7 +1422,8 @@ InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, // Here, xs[0].a == 0 and xs[0].b == 3, since the second, // designated initializer re-initializes the whole // subobject [0], overwriting previous initializers. - SemaRef.Diag(InitRange.getBegin(), diag::warn_subobject_initializer_overrides) + SemaRef.Diag(InitRange.getBegin(), + diag::warn_subobject_initializer_overrides) << InitRange; SemaRef.Diag(ExistingInit->getSourceRange().getBegin(), diag::note_previous_initializer) @@ -1429,12 +1431,10 @@ InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, << ExistingInit->getSourceRange(); } - SourceLocation StartLoc; - if (Index < IList->getNumInits()) - StartLoc = IList->getInit(Index)->getSourceRange().getBegin(); InitListExpr *Result - = new (SemaRef.Context) InitListExpr(StartLoc, 0, 0, - IList->getSourceRange().getEnd()); + = new (SemaRef.Context) InitListExpr(InitRange.getBegin(), 0, 0, + InitRange.getEnd()); + Result->setType(CurrentObjectType); // Link this new initializer list into the structured initializer diff --git a/test/Analysis/uninit-vals-ps.c b/test/Analysis/uninit-vals-ps.c index c6cf351ca2..659bee748f 100644 --- a/test/Analysis/uninit-vals-ps.c +++ b/test/Analysis/uninit-vals-ps.c @@ -15,7 +15,7 @@ int f1_a(struct FPRec* foo) { int f1_b() { int x; - return bar(x)+1; // expected-warning{{Pass-by-value argument in function is undefined.}} + return bar(x)+1; // expected-warning{{Pass-by-value argument in function call is undefined.}} } int f2() {