diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-10-08 04:53:31 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-10-08 04:53:31 +0000 |
commit | 3f02150d316dd8d468c5750fe894da3ffcc9a8a8 (patch) | |
tree | 520a1a74813218dd1709147e41e9930fa4e36d71 /clang/lib | |
parent | 3459ce2e5ebbabb8d4dde3809da50dc89e1b0b35 (diff) | |
download | bcm5719-llvm-3f02150d316dd8d468c5750fe894da3ffcc9a8a8.tar.gz bcm5719-llvm-3f02150d316dd8d468c5750fe894da3ffcc9a8a8.zip |
[MSVC Compat] Enable ABI impacting non-conforming behavior independently of -fms-compatibility
No ABI for C++ currently makes it possible to implement the standard
100% perfectly. We wrongly hid some of our compatible behavior behind
-fms-compatibility instead of tying it to the compiler ABI.
llvm-svn: 249656
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 13 | ||||
-rw-r--r-- | clang/lib/AST/Decl.cpp | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/ModuleBuilder.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 3 |
5 files changed, 14 insertions, 9 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 47d0107a66d..ffa8cbbf6c5 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -5033,9 +5033,10 @@ CharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const { } bool ASTContext::isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const { - return getLangOpts().MSVCCompat && VD->isStaticDataMember() && - VD->getType()->isIntegralOrEnumerationType() && - VD->isFirstDecl() && !VD->isOutOfLine() && VD->hasInit(); + return getTargetInfo().getCXXABI().isMicrosoft() && + VD->isStaticDataMember() && + VD->getType()->isIntegralOrEnumerationType() && VD->isFirstDecl() && + !VD->isOutOfLine() && VD->hasInit(); } static inline @@ -8270,7 +8271,8 @@ static GVALinkage basicGVALinkageForFunction(const ASTContext &Context, if (!FD->isInlined()) return External; - if ((!Context.getLangOpts().CPlusPlus && !Context.getLangOpts().MSVCCompat && + if ((!Context.getLangOpts().CPlusPlus && + !Context.getTargetInfo().getCXXABI().isMicrosoft() && !FD->hasAttr<DLLExportAttr>()) || FD->hasAttr<GNUInlineAttr>()) { // FIXME: This doesn't match gcc's behavior for dllexport inline functions. @@ -8346,7 +8348,8 @@ static GVALinkage basicGVALinkageForVariable(const ASTContext &Context, return GVA_StrongExternal; case TSK_ExplicitSpecialization: - return Context.getLangOpts().MSVCCompat && VD->isStaticDataMember() + return Context.getTargetInfo().getCXXABI().isMicrosoft() && + VD->isStaticDataMember() ? GVA_StrongODR : GVA_StrongExternal; diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 594cfa359c5..098298f0c59 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -2703,7 +2703,8 @@ bool FunctionDecl::isMSExternInline() const { assert(isInlined() && "expected to get called on an inlined function!"); const ASTContext &Context = getASTContext(); - if (!Context.getLangOpts().MSVCCompat && !hasAttr<DLLExportAttr>()) + if (!Context.getTargetInfo().getCXXABI().isMicrosoft() && + !hasAttr<DLLExportAttr>()) return false; for (const FunctionDecl *FD = getMostRecentDecl(); FD; diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 9e9963cd192..40eb678d585 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2386,7 +2386,7 @@ static bool isVarDeclStrongDefinition(const ASTContext &Context, // Declarations with a required alignment do not have common linakge in MSVC // mode. - if (Context.getLangOpts().MSVCCompat) { + if (Context.getTargetInfo().getCXXABI().isMicrosoft()) { if (D->hasAttr<AlignedAttr>()) return true; QualType VarType = D->getType(); diff --git a/clang/lib/CodeGen/ModuleBuilder.cpp b/clang/lib/CodeGen/ModuleBuilder.cpp index b73d332ff4d..0be5c5592b2 100644 --- a/clang/lib/CodeGen/ModuleBuilder.cpp +++ b/clang/lib/CodeGen/ModuleBuilder.cpp @@ -175,7 +175,7 @@ namespace { // For MSVC compatibility, treat declarations of static data members with // inline initializers as definitions. - if (Ctx->getLangOpts().MSVCCompat) { + if (Ctx->getTargetInfo().getCXXABI().isMicrosoft()) { for (Decl *Member : D->decls()) { if (VarDecl *VD = dyn_cast<VarDecl>(Member)) { if (Ctx->isMSStaticDataMemberInlineDefinition(VD) && diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 467b36dfeec..23d4491d04c 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -11768,9 +11768,10 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, UPPC_FixedUnderlyingType)) EnumUnderlying = Context.IntTy.getTypePtr(); - } else if (getLangOpts().MSVCCompat) + } else if (Context.getTargetInfo().getCXXABI().isMicrosoft()) { // Microsoft enums are always of int type. EnumUnderlying = Context.IntTy.getTypePtr(); + } } DeclContext *SearchDC = CurContext; |