Skip to content
Snippets Groups Projects
  1. Sep 07, 2016
  2. Sep 06, 2016
  3. Sep 05, 2016
  4. Sep 04, 2016
  5. Sep 03, 2016
  6. Sep 02, 2016
    • Eric Fiselier's avatar
      Implement __attribute__((require_constant_initialization)) for safe static initialization. · 89aa3ede
      Eric Fiselier authored
      Summary:
      This attribute specifies expectations about the initialization of static and
      thread local variables. Specifically that the variable has a
      [constant initializer](http://en.cppreference.com/w/cpp/language/constant_initialization)
      according to the rules of [basic.start.static]. Failure to meet this expectation
      will result in an error.
      
      Static objects with constant initializers avoid hard-to-find bugs caused by
      the indeterminate order of dynamic initialization. They can also be safely
      used by other static constructors across translation units.
      
      This attribute acts as a compile time assertion that the requirements
      for constant initialization have been met. Since these requirements change
      between dialects and have subtle pitfalls it's important to fail fast instead
      of silently falling back on dynamic initialization.
      
      ```c++
        // -std=c++14
        #define SAFE_STATIC __attribute__((require_constant_initialization)) static
        struct T {
          constexpr T(int) {}
          ~T();
        };
        SAFE_STATIC T x = {42}; // OK.
        SAFE_STATIC T y = 42; // error: variable does not have a constant initializer
        // copy initialization is not a constant expression on a non-literal type.
      ```
      This attribute can only be applied to objects with static or thread-local storage
      duration.
      
      Reviewers: majnemer, rsmith, aaron.ballman
      
      Subscribers: jroelofs, cfe-commits
      
      Differential Revision: https://reviews.llvm.org/D23385
      
      git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@280525 91177308-0d34-0410-b5e6-96231b3b80d8
      89aa3ede
Loading