Hi hansw,

This fixes PR21718.

http://reviews.llvm.org/D6528

Files:
  lib/Sema/SemaDeclCXX.cpp
  test/CodeGenCXX/dllexport.cpp
Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp
+++ lib/Sema/SemaDeclCXX.cpp
@@ -4742,6 +4742,10 @@
 
     if (MD && ClassExported) {
       if (MD->isUserProvided()) {
+        // Don't mark constexpr functions again
+        if (MD->isConstexpr())
+          continue;
+
         // Instantiate non-default methods..
 
         // .. except for certain kinds of template specializations.
Index: test/CodeGenCXX/dllexport.cpp
===================================================================
--- test/CodeGenCXX/dllexport.cpp
+++ test/CodeGenCXX/dllexport.cpp
@@ -615,6 +615,10 @@
 struct __declspec(dllexport) ExportedDerivedClass : NonExportedBaseClass {};
 // M32-DAG: weak_odr dllexport x86_thiscallcc void @"\01??1ExportedDerivedClass@@UAE@XZ"
 
+// Exported constexpr function is only codegened once.
+template <class> struct Q { constexpr Q() {} };
+template class __declspec(dllexport) Q<void>;
+// M32-DAG: define weak_odr dllexport x86_thiscallcc %struct.Q* @"\01??0?$Q@X@@QAE@XZ"(%struct.Q* returned %this)
 
 //===----------------------------------------------------------------------===//
 // Classes with template base classes
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to