summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2016-04-08 19:57:40 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2016-04-08 19:57:40 +0000
commitfe1bc708b53016d0800b54342b268c09b8c52a6f (patch)
tree1bba4b57484d4783544a23a1d74fb93ad1e04283
parentfec5c64b633fbdb2e7871fa237467397b6663e6f (diff)
downloadbcm5719-llvm-fe1bc708b53016d0800b54342b268c09b8c52a6f.tar.gz
bcm5719-llvm-fe1bc708b53016d0800b54342b268c09b8c52a6f.zip
[modules] Handle merged fields in designated initializers.
llvm-svn: 265838
-rw-r--r--clang/lib/Sema/SemaInit.cpp8
-rw-r--r--clang/test/Modules/Inputs/merge-decl-context/a.h4
-rw-r--r--clang/test/Modules/merge-decl-context.cpp8
3 files changed, 17 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index bd8522d5977..81b5312d87a 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -2227,8 +2227,10 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
for (auto *FI : RT->getDecl()->fields()) {
if (FI->isUnnamedBitfield())
continue;
- if (KnownField == FI)
+ if (declaresSameEntity(KnownField, FI)) {
+ KnownField = FI;
break;
+ }
++FieldIndex;
}
@@ -2241,11 +2243,11 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
FieldIndex = 0;
if (!VerifyOnly) {
FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion();
- if (CurrentField && CurrentField != *Field) {
+ if (CurrentField && !declaresSameEntity(CurrentField, *Field)) {
assert(StructuredList->getNumInits() == 1
&& "A union should never have more than one initializer!");
- // we're about to throw away an initializer, emit warning
+ // We're about to throw away an initializer, emit warning.
SemaRef.Diag(D->getFieldLoc(),
diag::warn_initializer_overrides)
<< D->getSourceRange();
diff --git a/clang/test/Modules/Inputs/merge-decl-context/a.h b/clang/test/Modules/Inputs/merge-decl-context/a.h
index 89cc7120fd1..7be90b1535d 100644
--- a/clang/test/Modules/Inputs/merge-decl-context/a.h
+++ b/clang/test/Modules/Inputs/merge-decl-context/a.h
@@ -21,4 +21,8 @@ inline A<int> ff(int i) {
return fff<A<int>>(&i);
}
+struct Aggregate {
+ int member;
+};
+
#endif
diff --git a/clang/test/Modules/merge-decl-context.cpp b/clang/test/Modules/merge-decl-context.cpp
index 55219ed587b..5dbf3d1bd95 100644
--- a/clang/test/Modules/merge-decl-context.cpp
+++ b/clang/test/Modules/merge-decl-context.cpp
@@ -18,7 +18,13 @@
// RUN: -fmodule-map-file=%S/Inputs/merge-decl-context/merge-decl-context.modulemap -I%S/Inputs \
// RUN: -emit-llvm -o %t/test.o %s
+// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t \
+// RUN: -fmodule-map-file=%S/Inputs/merge-decl-context/merge-decl-context.modulemap -I%S/Inputs \
+// RUN: -emit-llvm -o %t/test.o -DNO_TEXTUAL_INCLUSION %s
+
+#ifndef NO_TEXTUAL_INCLUSION
#include "Inputs/merge-decl-context/a.h"
+#endif
#include "Inputs/merge-decl-context/b.h"
#include "Inputs/merge-decl-context/c.h"
#include "Inputs/merge-decl-context/d.h"
@@ -26,3 +32,5 @@
void t() {
ff(42);
}
+
+static_assert(Aggregate{.member = 1}.member == 1, "");
OpenPOWER on IntegriCloud