Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Sema][TreeTransform] Re-create DesignatedInitExpr when a field desig…
…nator has no field declaration. This commit fixes an invalid Winitializer-overrides warning that's shown when analyzing a second (or any after the first) instantiation of a designated initializer. This invalid warning is fixed by making sure that a DesignatedInitExpr is rebuilt by the tree transformer when it has a field designator whose FieldDecl* hasn't been yet initialized. This ensures that a different DesignatedInitExpr is processed by Sema for every instantiation, and thus the invalid warning is avoided. rdar://28768441 Differential Revision: https://reviews.llvm.org/D25777 llvm-svn: 284959
- Loading branch information
Showing
2 changed files
with
44 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Winitializer-overrides %s | ||
|
||
template <typename T> struct Foo { | ||
struct SubFoo { | ||
int bar1; | ||
int bar2; | ||
}; | ||
|
||
static void Test() { SubFoo sf = {.bar1 = 10, .bar2 = 20}; } // Expected no warning | ||
}; | ||
|
||
void foo() { | ||
Foo<int>::Test(); | ||
Foo<bool>::Test(); | ||
Foo<float>::Test(); | ||
} | ||
|
||
template <typename T> struct Bar { | ||
struct SubFoo { | ||
int bar1; | ||
int bar2; | ||
}; | ||
|
||
static void Test() { SubFoo sf = {.bar1 = 10, // expected-note 2 {{previous initialization is here}} | ||
.bar1 = 20}; } // expected-warning 2 {{initializer overrides prior initialization of this subobject}} | ||
}; | ||
|
||
void bar() { | ||
Bar<int>::Test(); // expected-note {{in instantiation of member function 'Bar<int>::Test' requested here}} | ||
Bar<bool>::Test(); // expected-note {{in instantiation of member function 'Bar<bool>::Test' requested here}} | ||
} |