arphaman created this revision.
arphaman added a reviewer: rsmith.
arphaman added a subscriber: cfe-commits.
arphaman set the repository for this revision to rL LLVM.

This patch fixes an assertion failure crash that happens when a constant record 
reference member is initialized using an empty initializer list.


Repository:
  rL LLVM

https://reviews.llvm.org/D25719

Files:
  lib/Sema/SemaExprCXX.cpp
  test/SemaCXX/cxx11-crashes.cpp


Index: test/SemaCXX/cxx11-crashes.cpp
===================================================================
--- test/SemaCXX/cxx11-crashes.cpp
+++ test/SemaCXX/cxx11-crashes.cpp
@@ -91,3 +91,33 @@
   Foo(lambda);
 }
 }
+
+namespace pr30664 {
+struct foo {
+  int x;
+  foo() : x(42) { }
+};
+
+struct bar {
+  const foo &o;  // expected-note {{reference member declared here}}
+  bar() : o{} {} // expected-warning {{binding reference member 'o' to a 
temporary value}}
+};
+
+struct outer {
+  struct inner {
+    const outer &o;    // expected-note {{reference member declared here}}
+    inner() : o({}) {} // expected-warning {{binding reference member 'o' to a 
temporary value}}
+  };
+};
+
+outer::inner i;
+
+struct foobar {
+  foobar(void) { }
+  struct inner {
+    int y;
+    const foobar &o; // expected-note {{reference member declared here}}
+    inner() : y(21), o({}) {} // expected-warning {{binding reference member 
'o' to a temporary value}}
+  };
+};
+}
Index: lib/Sema/SemaExprCXX.cpp
===================================================================
--- lib/Sema/SemaExprCXX.cpp
+++ lib/Sema/SemaExprCXX.cpp
@@ -3426,8 +3426,12 @@
         if (!ICS.UserDefined.EllipsisConversion) {
           // If the user-defined conversion is specified by a constructor, the
           // initial standard conversion sequence converts the source type to
-          // the type required by the argument of the constructor
-          BeforeToType = 
Ctor->getParamDecl(0)->getType().getNonReferenceType();
+          // the type required by the argument of the constructor or the 'void'
+          // type if the argument has no constructors.
+          BeforeToType =
+              Ctor->param_empty()
+                  ? Context.VoidTy
+                  : Ctor->getParamDecl(0)->getType().getNonReferenceType();
         }
       }
       // Watch out for ellipsis conversion.


Index: test/SemaCXX/cxx11-crashes.cpp
===================================================================
--- test/SemaCXX/cxx11-crashes.cpp
+++ test/SemaCXX/cxx11-crashes.cpp
@@ -91,3 +91,33 @@
   Foo(lambda);
 }
 }
+
+namespace pr30664 {
+struct foo {
+  int x;
+  foo() : x(42) { }
+};
+
+struct bar {
+  const foo &o;  // expected-note {{reference member declared here}}
+  bar() : o{} {} // expected-warning {{binding reference member 'o' to a temporary value}}
+};
+
+struct outer {
+  struct inner {
+    const outer &o;    // expected-note {{reference member declared here}}
+    inner() : o({}) {} // expected-warning {{binding reference member 'o' to a temporary value}}
+  };
+};
+
+outer::inner i;
+
+struct foobar {
+  foobar(void) { }
+  struct inner {
+    int y;
+    const foobar &o; // expected-note {{reference member declared here}}
+    inner() : y(21), o({}) {} // expected-warning {{binding reference member 'o' to a temporary value}}
+  };
+};
+}
Index: lib/Sema/SemaExprCXX.cpp
===================================================================
--- lib/Sema/SemaExprCXX.cpp
+++ lib/Sema/SemaExprCXX.cpp
@@ -3426,8 +3426,12 @@
         if (!ICS.UserDefined.EllipsisConversion) {
           // If the user-defined conversion is specified by a constructor, the
           // initial standard conversion sequence converts the source type to
-          // the type required by the argument of the constructor
-          BeforeToType = Ctor->getParamDecl(0)->getType().getNonReferenceType();
+          // the type required by the argument of the constructor or the 'void'
+          // type if the argument has no constructors.
+          BeforeToType =
+              Ctor->param_empty()
+                  ? Context.VoidTy
+                  : Ctor->getParamDecl(0)->getType().getNonReferenceType();
         }
       }
       // Watch out for ellipsis conversion.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to