[DeclCXX] Remove unknown external linkage specifications

Partial revert of r372681 "Support for DWARF-5 C++ language tags".

The change introduced new external linkage languages ("C++11" and
"C++14") which not supported in C++.

It also changed the definition of the existing enum to use the DWARF
constants. The problem is that "LinkageSpecDeclBits.Language" (the field
that reserves this enum) is actually defined as 3 bits length
(bitfield), which cannot contain the new DWARF constants. Defining the
enum as integer literals is more appropriate for maintaining valid
values.

Differential Revision: https://reviews.llvm.org/D69935
This commit is contained in:
Ehud Katz 2019-11-07 12:28:48 +02:00
parent 7b957ddc98
commit c63f1b160e
8 changed files with 7 additions and 44 deletions

View File

@ -585,8 +585,6 @@ public:
LinkageLabel = "extern \"C\" {}";
break;
case LinkageSpecDecl::lang_cxx:
case LinkageSpecDecl::lang_cxx_11:
case LinkageSpecDecl::lang_cxx_14:
LinkageLabel = "extern \"C++\" {}";
break;
}

View File

@ -42,7 +42,6 @@
#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/PointerLikeTypeTraits.h"
@ -2758,15 +2757,8 @@ public:
/// Represents the language in a linkage specification.
///
/// The values are part of the serialization ABI for
/// ASTs and cannot be changed without altering that ABI. To help
/// ensure a stable ABI for this, we choose the DW_LANG_ encodings
/// from the dwarf standard.
enum LanguageIDs {
lang_c = llvm::dwarf::DW_LANG_C,
lang_cxx = llvm::dwarf::DW_LANG_C_plus_plus,
lang_cxx_11 = llvm::dwarf::DW_LANG_C_plus_plus_11,
lang_cxx_14 = llvm::dwarf::DW_LANG_C_plus_plus_14
};
/// ASTs and cannot be changed without altering that ABI.
enum LanguageIDs { lang_c = 1, lang_cxx = 2 };
private:
/// The source location for the extern keyword.

View File

@ -1011,19 +1011,12 @@ void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) {
void DeclPrinter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
const char *l;
switch (D->getLanguage()) {
case LinkageSpecDecl::lang_c:
if (D->getLanguage() == LinkageSpecDecl::lang_c)
l = "C";
break;
case LinkageSpecDecl::lang_cxx_14:
l = "C++14";
break;
case LinkageSpecDecl::lang_cxx_11:
l = "C++11";
break;
case LinkageSpecDecl::lang_cxx:
else {
assert(D->getLanguage() == LinkageSpecDecl::lang_cxx &&
"unknown language in linkage specification");
l = "C++";
break;
}
Out << "extern \"" << l << "\" ";

View File

@ -878,12 +878,6 @@ void JSONNodeDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *LSD) {
switch (LSD->getLanguage()) {
case LinkageSpecDecl::lang_c: Lang = "C"; break;
case LinkageSpecDecl::lang_cxx: Lang = "C++"; break;
case LinkageSpecDecl::lang_cxx_11:
Lang = "C++11";
break;
case LinkageSpecDecl::lang_cxx_14:
Lang = "C++14";
break;
}
JOS.attribute("language", Lang);
attributeOnlyIfTrue("hasBraces", LSD->hasBraces());

View File

@ -1769,12 +1769,6 @@ void TextNodeDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *D) {
case LinkageSpecDecl::lang_cxx:
OS << " C++";
break;
case LinkageSpecDecl::lang_cxx_11:
OS << " C++11";
break;
case LinkageSpecDecl::lang_cxx_14:
OS << " C++14";
break;
}
}

View File

@ -5192,9 +5192,7 @@ void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
// EmitLinkageSpec - Emit all declarations in a linkage spec.
void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) {
if (LSD->getLanguage() != LinkageSpecDecl::lang_c &&
LSD->getLanguage() != LinkageSpecDecl::lang_cxx &&
LSD->getLanguage() != LinkageSpecDecl::lang_cxx_11 &&
LSD->getLanguage() != LinkageSpecDecl::lang_cxx_14) {
LSD->getLanguage() != LinkageSpecDecl::lang_cxx) {
ErrorUnsupported(LSD, "linkage spec");
return;
}

View File

@ -14205,10 +14205,6 @@ Decl *Sema::ActOnStartLinkageSpecification(Scope *S, SourceLocation ExternLoc,
Language = LinkageSpecDecl::lang_c;
else if (Lang == "C++")
Language = LinkageSpecDecl::lang_cxx;
else if (Lang == "C++11")
Language = LinkageSpecDecl::lang_cxx_11;
else if (Lang == "C++14")
Language = LinkageSpecDecl::lang_cxx_14;
else {
Diag(LangStr->getExprLoc(), diag::err_language_linkage_spec_unknown)
<< LangStr->getSourceRange();

View File

@ -31,8 +31,6 @@ static void checkModuleImportContext(Sema &S, Module *M,
ExternCLoc = LSD->getBeginLoc();
break;
case LinkageSpecDecl::lang_cxx:
case LinkageSpecDecl::lang_cxx_11:
case LinkageSpecDecl::lang_cxx_14:
break;
}
DC = LSD->getParent();