]> granicus.if.org Git - clang/commitdiff
Fix PR3509 by providing correct starting locations for initializer lists
authorDouglas Gregor <dgregor@apple.com>
Sun, 1 Mar 2009 17:12:46 +0000 (17:12 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 1 Mar 2009 17:12:46 +0000 (17:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65777 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp
test/Analysis/uninit-vals-ps.c

index 5b022217e545a9679cc0e256747eef4650aaf825..02df9b32fa36cb9c35b36b0251035b4c9df9cbbe 100644 (file)
@@ -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
index c6cf351ca2da0bf0b8cd86dda9764df6b5d4b048..659bee748f1642a3caf40045b580f63bf9e2a855 100644 (file)
@@ -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() {