diff options
| author | Nico Weber <nicolasweber@gmx.de> | 2014-05-30 17:27:21 +0000 |
|---|---|---|
| committer | Nico Weber <nicolasweber@gmx.de> | 2014-05-30 17:27:21 +0000 |
| commit | 897f23dda82cae6e08c464509195be90015ed3c8 (patch) | |
| tree | 4ab4a630fd2653f8f8ff150f585546ea9863cf86 | |
| parent | 853ae946607ab370e10703f1550c72404374efd9 (diff) | |
| download | bcm5719-llvm-897f23dda82cae6e08c464509195be90015ed3c8.tar.gz bcm5719-llvm-897f23dda82cae6e08c464509195be90015ed3c8.zip | |
Let libc++abi compile with gcc.
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
| -rw-r--r-- | libcxxabi/src/cxa_demangle.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp index ff28c79bee3..c67e20fdf47 100644 --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -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; |

