ahatanak created this revision.
ahatanak added reviewers: rsmith, rnk, arphaman.
ahatanak added a subscriber: cfe-commits.

CheckDesignatedInitializer wasn't taking into account the base classes when 
computing the index for the field in the derived class, which caused the test 
case to crash during IRGen because of a malformed AST.


https://reviews.llvm.org/D28705

Files:
  lib/Sema/SemaInit.cpp
  test/SemaCXX/designated-initializers-base-class.cpp


Index: test/SemaCXX/designated-initializers-base-class.cpp
===================================================================
--- /dev/null
+++ test/SemaCXX/designated-initializers-base-class.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 %s -std=c++1z -ast-dump | FileCheck %s
+
+// CHECK: VarDecl {{.*}} d 'struct D' cinit
+// CHECK: InitListExpr {{.*}} 'struct D'
+// CHECK: InitListExpr {{.*}} 'struct B'
+// CHECK: ImplicitValueInitExpr {{.*}} 'int'
+// CHECK: IntegerLiteral {{.*}} 'int' 1
+
+struct B {
+  int x;
+};
+
+struct D : B {
+  int y;
+};
+
+void test() {
+  D d = { .y = 1 };
+}
Index: lib/Sema/SemaInit.cpp
===================================================================
--- lib/Sema/SemaInit.cpp
+++ lib/Sema/SemaInit.cpp
@@ -2247,6 +2247,9 @@
       ++FieldIndex;
     }
 
+    if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
+      FieldIndex += CXXRD->getNumBases();
+
     RecordDecl::field_iterator Field =
         RecordDecl::field_iterator(DeclContext::decl_iterator(KnownField));
 


Index: test/SemaCXX/designated-initializers-base-class.cpp
===================================================================
--- /dev/null
+++ test/SemaCXX/designated-initializers-base-class.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 %s -std=c++1z -ast-dump | FileCheck %s
+
+// CHECK: VarDecl {{.*}} d 'struct D' cinit
+// CHECK: InitListExpr {{.*}} 'struct D'
+// CHECK: InitListExpr {{.*}} 'struct B'
+// CHECK: ImplicitValueInitExpr {{.*}} 'int'
+// CHECK: IntegerLiteral {{.*}} 'int' 1
+
+struct B {
+  int x;
+};
+
+struct D : B {
+  int y;
+};
+
+void test() {
+  D d = { .y = 1 };
+}
Index: lib/Sema/SemaInit.cpp
===================================================================
--- lib/Sema/SemaInit.cpp
+++ lib/Sema/SemaInit.cpp
@@ -2247,6 +2247,9 @@
       ++FieldIndex;
     }
 
+    if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
+      FieldIndex += CXXRD->getNumBases();
+
     RecordDecl::field_iterator Field =
         RecordDecl::field_iterator(DeclContext::decl_iterator(KnownField));
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to