Let libc++abi compile with gcc.
authorNico Weber <nicolasweber@gmx.de>
Fri, 30 May 2014 17:27:21 +0000 (17:27 +0000)
committerNico Weber <nicolasweber@gmx.de>
Fri, 30 May 2014 17:27:21 +0000 (17:27 +0000)
There was a single problem in cxa_demangle.cpp, where gcc would complain
`error: changes meaning of 'String'` about the line `typedef String String;`.
According to 3.3.7p2, this diagnostic is allowed (but not required, so clang
does not have to report this).

As a fix, make string_pair a template and pass String as template parameter.
This fixes the error with gcc and also removes some repetition from the code.

No behavior change.

llvm-svn: 209909

libcxxabi/src/cxa_demangle.cpp

index ff28c79..c67e20f 100644 (file)
@@ -4847,32 +4847,33 @@ operator!=(const malloc_alloc<T>& x, const malloc_alloc<U>& y) noexcept
 const size_t bs = 4 * 1024;
 template <class T> using Alloc = short_alloc<T, bs>;
 template <class T> using Vector = std::vector<T, Alloc<T>>;
-using String = std::basic_string<char, std::char_traits<char>, malloc_alloc<char>>;
 
+template <class StrT>
 struct string_pair
 {
-    String first;
-    String second;
+    StrT first;
+    StrT second;
 
     string_pair() = default;
-    string_pair(String f) : first(std::move(f)) {}
-    string_pair(String f, String s)
+    string_pair(StrT f) : first(std::move(f)) {}
+    string_pair(StrT f, StrT s)
         : first(std::move(f)), second(std::move(s)) {}
     template <size_t N>
         string_pair(const char (&s)[N]) : first(s, N-1) {}
 
     size_t size() const {return first.size() + second.size();}
-    String full() const {return first + second;}
-    String move_full() {return std::move(first) + std::move(second);}
+    StrT full() const {return first + second;}
+    StrT move_full() {return std::move(first) + std::move(second);}
 };
 
 struct Db
 {
-    typedef String String;
-    typedef Vector<string_pair> sub_type;
+    typedef std::basic_string<char, std::char_traits<char>,
+                              malloc_alloc<char>> String;
+    typedef Vector<string_pair<String>> sub_type;
     typedef Vector<sub_type> template_param_type;
-    Vector<string_pair> names;
-    Vector<sub_type> subs;
+    sub_type names;
+    template_param_type subs;
     Vector<template_param_type> template_param;
     unsigned cv;
     unsigned ref;