yaxunl created this revision.
yaxunl added a reviewer: tra.

ShouldDeleteSpecialMember is called upon inherited constructors.
It calls inferCUDATargetForImplicitSpecialMember, which in turn
calls LookupSpecialMember.

LookupSpecialMember expects ConstArg==false for
CXXDefaultConstructor. For inherited constructor with
const arguments, this causes assertion.

This patch fixes that by passing false as ConstArg argument
for CXXDefaultConstructor in ShouldDeleteSpecialMember.


https://reviews.llvm.org/D51809

Files:
  lib/Sema/SemaDeclCXX.cpp
  test/SemaCUDA/inherited-ctor.cu


Index: test/SemaCUDA/inherited-ctor.cu
===================================================================
--- /dev/null
+++ test/SemaCUDA/inherited-ctor.cu
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
+// expected-no-diagnostics
+
+struct A {
+  A(const int &x) {}
+};
+
+struct B : A {
+  using A::A;
+};
+
+struct C {
+  struct B b;
+  C() : b(0) {}
+};
+
+void test() {
+  B b(0);
+  C c;
+}
Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp
+++ lib/Sema/SemaDeclCXX.cpp
@@ -7187,8 +7187,9 @@
   if (getLangOpts().CUDA) {
     // We should delete the special member in CUDA mode if target inference
     // failed.
-    return inferCUDATargetForImplicitSpecialMember(RD, CSM, MD, SMI.ConstArg,
-                                                   Diagnose);
+    return inferCUDATargetForImplicitSpecialMember(
+        RD, CSM, MD, CSM == CXXDefaultConstructor ? false : SMI.ConstArg,
+        Diagnose);
   }
 
   return false;


Index: test/SemaCUDA/inherited-ctor.cu
===================================================================
--- /dev/null
+++ test/SemaCUDA/inherited-ctor.cu
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
+// expected-no-diagnostics
+
+struct A {
+  A(const int &x) {}
+};
+
+struct B : A {
+  using A::A;
+};
+
+struct C {
+  struct B b;
+  C() : b(0) {}
+};
+
+void test() {
+  B b(0);
+  C c;
+}
Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp
+++ lib/Sema/SemaDeclCXX.cpp
@@ -7187,8 +7187,9 @@
   if (getLangOpts().CUDA) {
     // We should delete the special member in CUDA mode if target inference
     // failed.
-    return inferCUDATargetForImplicitSpecialMember(RD, CSM, MD, SMI.ConstArg,
-                                                   Diagnose);
+    return inferCUDATargetForImplicitSpecialMember(
+        RD, CSM, MD, CSM == CXXDefaultConstructor ? false : SMI.ConstArg,
+        Diagnose);
   }
 
   return false;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to