r230115 - Improve diagnostic when failing to synthesize implicit member due to dllexport (PR22591)

Hans Wennborg hans at hanshq.net
Fri Feb 20 17:07:24 PST 2015

Author: hans
Date: Fri Feb 20 19:07:24 2015
New Revision: 230115

URL: http://llvm.org/viewvc/llvm-project?rev=230115&view=rev
Improve diagnostic when failing to synthesize implicit member due to dllexport (PR22591)

This is only a problem in C++03 mode targeting MS ABI (MinGW doesn't
export inline methods, and C++11 marks these methods implicitly

Since targeting the MS ABI in pre-C++11 mode is a rare configuration,
this will probably not get fixed, but we can at least have a better
error message.


Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=230115&r1=230114&r2=230115&view=diff
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Feb 20 19:07:24 2015
@@ -1302,6 +1302,8 @@ def err_missing_default_ctor : Error<
   "%select{|implicit default |inheriting }0constructor for %1 must explicitly "
   "initialize the %select{base class|member}2 %3 which does not have a default "
+def note_due_to_dllexported_class : Note<
+  "due to '%0' being dllexported%select{|; try compiling in C++11 mode}1">;
 def err_illegal_union_or_anon_struct_member : Error<
   "%select{anonymous struct|union}0 member %1 has a non-trivial "

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=230115&r1=230114&r2=230115&view=diff
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Fri Feb 20 19:07:24 2015
@@ -4821,7 +4821,13 @@ static void checkDLLAttribute(Sema &S, C
         // defaulted methods, and the copy and move assignment operators. The
         // latter are exported even if they are trivial, because the address of
         // an operator can be taken and should compare equal accross libraries.
+        DiagnosticErrorTrap Trap(S.Diags);
         S.MarkFunctionReferenced(Class->getLocation(), MD);
+        if (Trap.hasErrorOccurred()) {
+          S.Diag(ClassAttr->getLocation(), diag::note_due_to_dllexported_class)
+              << Class->getName() << !S.getLangOpts().CPlusPlus11;
+          break;
+        }
         // There is no later point when we will see the definition of this
         // function, so pass it to the consumer now.

Modified: cfe/trunk/test/SemaCXX/dllexport-pr22591.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/dllexport-pr22591.cpp?rev=230115&r1=230114&r2=230115&view=diff
--- cfe/trunk/test/SemaCXX/dllexport-pr22591.cpp (original)
+++ cfe/trunk/test/SemaCXX/dllexport-pr22591.cpp Fri Feb 20 19:07:24 2015
@@ -1,16 +1,25 @@
 // RUN: %clang_cc1 -triple i686-windows-gnu  -verify -std=c++03 %s
 // RUN: %clang_cc1 -triple i686-windows-gnu  -verify -std=c++11 %s
+// RUN: %clang_cc1 -triple i686-windows-msvc -verify -std=c++03 -DERROR %s
 // RUN: %clang_cc1 -triple i686-windows-msvc -verify -std=c++11 %s
-// FIXME: For C++03 MS ABI we erroneously try to synthesize default ctor, etc. for S.
+#ifndef ERROR
 // expected-no-diagnostics
 struct NonCopyable {
+#ifdef ERROR
+  // expected-note at +2{{declared private here}}
+#ifdef ERROR
+// expected-error at +4{{field of type 'NonCopyable' has private default constructor}}
+// expected-note at +3{{implicit default constructor for 'S' first required here}}
+// expected-note at +2{{due to 'S' being dllexported; try compiling in C++11 mode}}
 struct __declspec(dllexport) S {
   NonCopyable member;

More information about the cfe-commits mailing list