ArgArray -> format_arg_store
diff --git a/fmt/format.h b/fmt/format.h
index 7ca1de9..4093f3e 100644
--- a/fmt/format.h
+++ b/fmt/format.h
@@ -37,6 +37,7 @@
 #include <memory>
 #include <stdexcept>
 #include <string>
+#include <type_traits>
 #include <vector>
 #include <utility>
 
@@ -2093,34 +2094,33 @@
   return MakeValue< BasicFormatter<char> >::type(arg);
 }
 
-template <unsigned N, bool/*IsPacked*/= (N < format_args::MAX_PACKED_ARGS)>
-struct ArgArray;
+template <typename ...Args>
+class format_arg_store {
+ private:
+  static const size_t NUM_ARGS = sizeof...(Args);
+  static const bool PACKED = NUM_ARGS <= format_args::MAX_PACKED_ARGS;
 
-template <unsigned N>
-struct ArgArray<N, true/*IsPacked*/> {
-  typedef Value Type[N > 0 ? N : 1];
+  typedef typename std::conditional<PACKED, Value, Arg>::type value_type;
 
-  template <typename Formatter, typename T>
-  static Value make(const T &value) {
-#ifdef __clang__
-    Value result = MakeValue<Formatter>(value);
-    // Workaround a bug in Apple LLVM version 4.2 (clang-425.0.28) of clang:
-    // https://github.com/fmtlib/fmt/issues/276
-    (void)result.custom.format;
-    return result;
-#else
-    return MakeValue<Formatter>(value);
-#endif
-  }
+  // If the arguments are not packed we add one more element to mark the end.
+  std::array<value_type, NUM_ARGS + (PACKED ? 0 : 1)> data_;
+
+  template <typename Formatter, typename ...A>
+  friend format_arg_store<A...> make_format_args(const A & ... args);
+
+ public:
+  template <typename Formatter>
+  format_arg_store(const Args &... args, Formatter *)
+    : data_{MakeValue<Formatter>(args)...} {}
+
+  const value_type *data() const { return data_.data(); }
 };
 
-template <unsigned N>
-struct ArgArray<N, false/*IsPacked*/> {
-  typedef Arg Type[N + 1]; // +1 for the list end Arg::NONE
-
-  template <typename Formatter, typename T>
-  static Arg make(const T &value) { return MakeArg<Formatter>(value); }
-};
+template <typename Formatter, typename ...Args>
+inline format_arg_store<Args...> make_format_args(const Args & ... args) {
+  Formatter *f = nullptr;
+  return format_arg_store<Args...>(args..., f);
+}
 
 template <typename Arg, typename... Args>
 inline uint64_t make_type(const Arg &first, const Args & ... tail) {
@@ -2140,20 +2140,16 @@
 # define FMT_VARIADIC_VOID(func, arg_type) \
   template <typename... Args> \
   void func(arg_type arg0, const Args & ... args) { \
-    typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \
-    typename ArgArray::Type array{ \
-      ArgArray::template make<fmt::BasicFormatter<Char> >(args)...}; \
-    func(arg0, fmt::format_args(fmt::internal::make_type(args...), array)); \
+    auto store = fmt::internal::make_format_args< fmt::BasicFormatter<Char> >(args...); \
+    func(arg0, fmt::format_args(fmt::internal::make_type(args...), store.data())); \
   }
 
 // Defines a variadic constructor.
 # define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \
   template <typename... Args> \
   ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \
-    typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \
-    typename ArgArray::Type array{ \
-      ArgArray::template make<fmt::BasicFormatter<Char> >(args)...}; \
-    func(arg0, arg1, fmt::format_args(fmt::internal::make_type(args...), array)); \
+    auto store = internal::make_format_args< fmt::BasicFormatter<Char> >(args...); \
+    func(arg0, arg1, fmt::format_args(fmt::internal::make_type(args...), store.data())); \
   }
 
 // Generates a comma-separated list with results of applying f to pairs
@@ -3290,11 +3286,9 @@
   template <typename... Args> \
   ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \
       const Args & ... args) { \
-    typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \
-    typename ArgArray::Type array{ \
-      ArgArray::template make<fmt::BasicFormatter<Char> >(args)...}; \
+    auto store = fmt::internal::make_format_args< fmt::BasicFormatter<Char> >(args...); \
     call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \
-      fmt::format_args(fmt::internal::make_type(args...), array)); \
+      fmt::format_args(fmt::internal::make_type(args...), store.data())); \
   }
 
 /**
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 86e72b9..95ddca5 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -121,6 +121,7 @@
 check_cxx_compiler_flag(-fno-exceptions HAVE_FNO_EXCEPTIONS_FLAG)
 if (HAVE_FNO_EXCEPTIONS_FLAG)
   add_library(noexception-test ../fmt/format.cc)
+  target_compile_options(noexception-test PUBLIC ${CPP11_FLAG})
   target_include_directories(noexception-test PRIVATE ${PROJECT_SOURCE_DIR})
   target_compile_options(noexception-test PRIVATE -fno-exceptions)
 endif ()