hans created this revision. hans added a reviewer: majnemer. Clang would previously assert here.
https://reviews.llvm.org/D47875 Files: lib/AST/MicrosoftMangle.cpp test/CodeGenCXX/mangle-ms-cxx11.cpp Index: test/CodeGenCXX/mangle-ms-cxx11.cpp =================================================================== --- test/CodeGenCXX/mangle-ms-cxx11.cpp +++ test/CodeGenCXX/mangle-ms-cxx11.cpp @@ -1,5 +1,6 @@ // RUN: %clang_cc1 -std=c++11 -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 -fms-compatibility-version=19.00 | FileCheck %s --check-prefix=CHECK --check-prefix=MSVC2015 // RUN: %clang_cc1 -std=c++11 -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 -fms-compatibility-version=18.00 | FileCheck %s --check-prefix=CHECK --check-prefix=MSVC2013 +// RUN: %clang_cc1 -std=c++11 -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 -gcodeview -debug-info-kind=limited | FileCheck %s --check-prefix=DBG namespace FTypeWithQuals { template <typename T> @@ -350,3 +351,9 @@ void f(decltype(enumerator)) {} // CHECK-DAG: define internal void @"?f@@YAXW4<unnamed-enum-enumerator>@@@Z"( void use_f() { f(enumerator); } + +namespace pr37723 { +struct s { enum {}; }; +// DBG-DAG: DW_TAG_enumeration_type{{.*}}identifier: ".?AW4<unnamed-tag>@s@pr37723@@" +s x; +} Index: lib/AST/MicrosoftMangle.cpp =================================================================== --- lib/AST/MicrosoftMangle.cpp +++ lib/AST/MicrosoftMangle.cpp @@ -886,9 +886,12 @@ Name += TND->getName(); } else if (auto *ED = dyn_cast<EnumDecl>(TD)) { auto EnumeratorI = ED->enumerator_begin(); - assert(EnumeratorI != ED->enumerator_end()); - Name += "<unnamed-enum-"; - Name += EnumeratorI->getName(); + if (EnumeratorI == ED->enumerator_end()) { + Name += "<unnamed-tag"; + } else { + Name += "<unnamed-enum-"; + Name += EnumeratorI->getName(); + } } else { // Otherwise, number the types using a $S prefix. Name += "<unnamed-type-$S";
Index: test/CodeGenCXX/mangle-ms-cxx11.cpp =================================================================== --- test/CodeGenCXX/mangle-ms-cxx11.cpp +++ test/CodeGenCXX/mangle-ms-cxx11.cpp @@ -1,5 +1,6 @@ // RUN: %clang_cc1 -std=c++11 -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 -fms-compatibility-version=19.00 | FileCheck %s --check-prefix=CHECK --check-prefix=MSVC2015 // RUN: %clang_cc1 -std=c++11 -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 -fms-compatibility-version=18.00 | FileCheck %s --check-prefix=CHECK --check-prefix=MSVC2013 +// RUN: %clang_cc1 -std=c++11 -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 -gcodeview -debug-info-kind=limited | FileCheck %s --check-prefix=DBG namespace FTypeWithQuals { template <typename T> @@ -350,3 +351,9 @@ void f(decltype(enumerator)) {} // CHECK-DAG: define internal void @"?f@@YAXW4<unnamed-enum-enumerator>@@@Z"( void use_f() { f(enumerator); } + +namespace pr37723 { +struct s { enum {}; }; +// DBG-DAG: DW_TAG_enumeration_type{{.*}}identifier: ".?AW4<unnamed-tag>@s@pr37723@@" +s x; +} Index: lib/AST/MicrosoftMangle.cpp =================================================================== --- lib/AST/MicrosoftMangle.cpp +++ lib/AST/MicrosoftMangle.cpp @@ -886,9 +886,12 @@ Name += TND->getName(); } else if (auto *ED = dyn_cast<EnumDecl>(TD)) { auto EnumeratorI = ED->enumerator_begin(); - assert(EnumeratorI != ED->enumerator_end()); - Name += "<unnamed-enum-"; - Name += EnumeratorI->getName(); + if (EnumeratorI == ED->enumerator_end()) { + Name += "<unnamed-tag"; + } else { + Name += "<unnamed-enum-"; + Name += EnumeratorI->getName(); + } } else { // Otherwise, number the types using a $S prefix. Name += "<unnamed-type-$S";
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits