Skip to content

Commit

Permalink
Enable __declspec(selectany) on any platform
Browse files Browse the repository at this point in the history
Summary:
This feature was disabled probably by mistake in rL300562
This fixes bug https://bugs.llvm.org/show_bug.cgi?id=33285

Reviewers: davide, rnk

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D33852

llvm-svn: 313278
  • Loading branch information
prazek committed Sep 14, 2017
1 parent 3a81f84 commit 45761a6
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 2 deletions.
4 changes: 2 additions & 2 deletions clang/include/clang/Basic/Attr.td
Expand Up @@ -2472,9 +2472,9 @@ def DLLImport : InheritableAttr, TargetSpecificAttr<TargetWindows> {
let Documentation = [DLLImportDocs];
}

def SelectAny : InheritableAttr, TargetSpecificAttr<TargetWindows> {
def SelectAny : InheritableAttr {
let Spellings = [Declspec<"selectany">, GCC<"selectany">];
let Documentation = [Undocumented];
let Documentation = [SelectAnyDocs];
}

def Thread : Attr {
Expand Down
15 changes: 15 additions & 0 deletions clang/include/clang/Basic/AttrDocs.td
Expand Up @@ -3192,3 +3192,18 @@ This attribute can be added to an Objective-C ``@interface`` declaration to
ensure that this class cannot be subclassed.
}];
}


def SelectAnyDocs : Documentation {
let Category = DocCatType;
let Content = [{
This attribute appertains to a global symbol, causing it to have a weak
definition (
`linkonce <https://llvm.org/docs/LangRef.html#linkage-types>`_
), allowing the linker to select any definition.

For more information see
`gcc documentation <https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/Microsoft-Windows-Variable-Attributes.html>`_
or `msvc documentation <https://docs.microsoft.com/pl-pl/cpp/cpp/selectany>`_.
}];
}
2 changes: 2 additions & 0 deletions clang/test/Sema/attr-selectany.c
@@ -1,5 +1,7 @@
// RUN: %clang_cc1 -triple x86_64-win32 -fdeclspec -verify %s
// RUN: %clang_cc1 -triple x86_64-mingw32 -verify %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux -verify -fdeclspec %s
// RUN: %clang_cc1 -triple x86_64-win32-macho -verify -fdeclspec %s

extern __declspec(selectany) const int x1 = 1; // no warning, const means we need extern in C++

Expand Down
3 changes: 3 additions & 0 deletions clang/test/SemaCXX/attr-selectany.cpp
@@ -1,4 +1,7 @@
// RUN: %clang_cc1 -triple x86_64-win32 -fms-compatibility -fms-extensions -fsyntax-only -verify -std=c++11 %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux -fms-compatibility -fms-extensions -fsyntax-only -verify -std=c++11 %s
// RUN: %clang_cc1 -triple x86_64-win32-macho -fms-compatibility -fms-extensions -fsyntax-only -verify -std=c++11 %s

// MSVC produces similar diagnostics.

__declspec(selectany) void foo() { } // expected-error{{'selectany' can only be applied to data items with external linkage}}
Expand Down

0 comments on commit 45761a6

Please sign in to comment.