On Mon, Sep 28, 2020 at 4:46 PM Robinson, Paul <paul.robin...@sony.com> wrote: > > -----Original Message----- > > From: cfe-commits <cfe-commits-boun...@lists.llvm.org> On Behalf Of Aaron > > Ballman via cfe-commits > > Sent: Wednesday, September 23, 2020 3:27 PM > > To: cfe-commits@lists.llvm.org > > Subject: [clang] af1d3e6 - Allow init_priority values <= 100 and > 65535 > > within system headers. > > > > > > Author: Aaron Ballman > > Date: 2020-09-23T15:26:50-04:00 > > New Revision: af1d3e655991e5f0c86df372b8583a60d20268e0 > > > > URL: https://urldefense.com/v3/__https://github.com/llvm/llvm- > > project/commit/af1d3e655991e5f0c86df372b8583a60d20268e0__;!!JmoZiZGBv3RvKR > > Sx!uCGMaNBytzj1FhG349bRMYFleWUAIQwiwZLW4mUe1SfbBjKnJvDM4dGzlplaS-cftQ$ > > DIFF: https://urldefense.com/v3/__https://github.com/llvm/llvm- > > project/commit/af1d3e655991e5f0c86df372b8583a60d20268e0.diff__;!!JmoZiZGBv > > 3RvKRSx!uCGMaNBytzj1FhG349bRMYFleWUAIQwiwZLW4mUe1SfbBjKnJvDM4dGzlpn6UUxJFg > > $ > > > > LOG: Allow init_priority values <= 100 and > 65535 within system headers. > > > > This also adds some bare-bones documentation for the attribute rather > > than leaving it undocumented. > > > > Added: > > > > > > Modified: > > clang/include/clang/Basic/Attr.td > > clang/include/clang/Basic/AttrDocs.td > > clang/lib/Sema/SemaDeclAttr.cpp > > clang/test/SemaCXX/init-priority-attr.cpp > > > > Removed: > > > > > > > > ########################################################################## > > ###### > > diff --git a/clang/include/clang/Basic/Attr.td > > b/clang/include/clang/Basic/Attr.td > > index e8ac819c8b556..7222f396089e0 100644 > > --- a/clang/include/clang/Basic/Attr.td > > +++ b/clang/include/clang/Basic/Attr.td > > @@ -2196,7 +2196,7 @@ def InitPriority : InheritableAttr { > > let Spellings = [GCC<"init_priority", /*AllowInC*/0>]; > > let Args = [UnsignedArgument<"Priority">]; > > let Subjects = SubjectList<[Var], ErrorDiag>; > > - let Documentation = [Undocumented]; > > + let Documentation = [InitPriorityDocs]; > > } > > > > def Section : InheritableAttr { > > > > diff --git a/clang/include/clang/Basic/AttrDocs.td > > b/clang/include/clang/Basic/AttrDocs.td > > index 9c119218656d8..3e27924589e4a 100644 > > --- a/clang/include/clang/Basic/AttrDocs.td > > +++ b/clang/include/clang/Basic/AttrDocs.td > > @@ -57,6 +57,32 @@ global variable or function should be in after > > translation. > > let Heading = "section, __declspec(allocate)"; > > } > > > > +def InitPriorityDocs : Documentation { > > + let Category = DocCatVariable; > > + let Content = [{ > > +In C++, the order in which global variables are initialized across > > translation > > +units is unspecified, unlike the ordering within a single translation > > unit. The > > +``init_priority`` attribute allows you to specify a relative ordering for > > the > > +initialization of objects declared at namespace scope in C++. The > > priority is > > +given as an integer constant expression between 101 and 65535 > > (inclusive). > > +Priorities outside of that range are reserved for use by the > > implementation. A > > +lower value indicates a higher priority of initialization. Note that only > > the > > +relative ordering of values is important. For example: > > + > > +.. code-block:: c++ > > + > > + struct SomeType { SomeType(); }; > > + __attribute__((init_priority(200))) SomeType Obj1; > > + __attribute__((init_priority(101))) SomeType Obj2; > > + > > +``Obj1`` will be initialized *before* ``Obj2`` despite the usual order of > > +initialization being the opposite. > > I think here ``Obj2`` will be initialized before ``Obj1`` > despite the usual order? (Usual order would be in order of > declaration, and init_priority goes from low to high.)
You are absolutely correct -- I fat-fingered the example with a late change to the numerical suffixes. Thank you for catching this! I've corrected it in e7549dafcd33ced4280a81ca1d1ee4cc78ed253f. ~Aaron > --paulr > > > + > > +This attribute is only supported for C++ and Objective-C++ and is ignored > > in > > +other language modes. > > + }]; > > +} > > + > > def InitSegDocs : Documentation { > > let Category = DocCatVariable; > > let Content = [{ > > > > diff --git a/clang/lib/Sema/SemaDeclAttr.cpp > > b/clang/lib/Sema/SemaDeclAttr.cpp > > index 6edeb79396296..3babbe05ca8f9 100644 > > --- a/clang/lib/Sema/SemaDeclAttr.cpp > > +++ b/clang/lib/Sema/SemaDeclAttr.cpp > > @@ -3313,7 +3313,11 @@ static void handleInitPriorityAttr(Sema &S, Decl > > *D, const ParsedAttr &AL) { > > return; > > } > > > > - if (prioritynum < 101 || prioritynum > 65535) { > > + // Only perform the priority check if the attribute is outside of a > > system > > + // header. Values <= 100 are reserved for the implementation, and > > libc++ > > + // benefits from being able to specify values in that range. > > + if ((prioritynum < 101 || prioritynum > 65535) && > > + !S.getSourceManager().isInSystemHeader(AL.getLoc())) { > > S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_range) > > << E->getSourceRange() << AL << 101 << 65535; > > AL.setInvalid(); > > > > diff --git a/clang/test/SemaCXX/init-priority-attr.cpp > > b/clang/test/SemaCXX/init-priority-attr.cpp > > index 8f31e2fd62d00..5b5e3b9eb940e 100644 > > --- a/clang/test/SemaCXX/init-priority-attr.cpp > > +++ b/clang/test/SemaCXX/init-priority-attr.cpp > > @@ -1,4 +1,9 @@ > > // RUN: %clang_cc1 -fsyntax-only -verify %s > > +// RUN: %clang_cc1 -fsyntax-only -DSYSTEM -verify %s > > + > > +#if defined(SYSTEM) > > +#5 "init-priority-attr.cpp" 3 // system header > > +#endif > > > > class Two { > > private: > > @@ -21,7 +26,15 @@ Two foo __attribute__((init_priority(101))) ( 5, 6 ); > > > > Two goo __attribute__((init_priority(2,3))) ( 5, 6 ); // expected-error > > {{'init_priority' attribute takes one argument}} > > > > -Two coo[2] __attribute__((init_priority(3))); // expected-error > > {{'init_priority' attribute requires integer constant between 101 and > > 65535 inclusive}} > > +Two coo[2] __attribute__((init_priority(100))); > > +#if !defined(SYSTEM) > > +// expected-error@-2 {{'init_priority' attribute requires integer > > constant between 101 and 65535 inclusive}} > > +#endif > > + > > +Two boo[2] __attribute__((init_priority(65536))); > > +#if !defined(SYSTEM) > > +// expected-error@-2 {{'init_priority' attribute requires integer > > constant between 101 and 65535 inclusive}} > > +#endif > > > > Two koo[4] __attribute__((init_priority(1.13))); // expected-error > > {{'init_priority' attribute requires an integer constant}} > > > > @@ -30,6 +43,5 @@ Two func() __attribute__((init_priority(1001))); // > > expected-error {{'init_prio > > int i __attribute__((init_priority(1001))); // expected-error {{can only > > use 'init_priority' attribute on file-scope definitions of objects of > > class type}} > > > > int main() { > > - Two foo __attribute__((init_priority(1001))); // expected-error > > {{can only use 'init_priority' attribute on file-scope definitions of > > objects of class type}} > > + Two foo __attribute__((init_priority(1001))); // expected-error > > {{can > > only use 'init_priority' attribute on file-scope definitions of objects of > > class type}} > > } > > - > > > > > > > > _______________________________________________ > > cfe-commits mailing list > > cfe-commits@lists.llvm.org > > https://urldefense.com/v3/__https://lists.llvm.org/cgi- > > bin/mailman/listinfo/cfe- > > commits__;!!JmoZiZGBv3RvKRSx!uCGMaNBytzj1FhG349bRMYFleWUAIQwiwZLW4mUe1SfbB > > jKnJvDM4dGzlplvreK7og$ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits