On Fri, May 30, 2014 at 10:27 AM, Nico Weber <[email protected]> wrote: > Author: nico > Date: Fri May 30 12:27:21 2014 > New Revision: 209909 > > URL: http://llvm.org/viewvc/llvm-project?rev=209909&view=rev > Log: > 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.
Seems like a ind of painful workaround to introduce a template with one instantiation... What's the point of that typedef anyway? > > No behavior change. > > Modified: > libcxxabi/trunk/src/cxa_demangle.cpp > > Modified: libcxxabi/trunk/src/cxa_demangle.cpp > URL: > http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=209909&r1=209908&r2=209909&view=diff > ============================================================================== > --- libcxxabi/trunk/src/cxa_demangle.cpp (original) > +++ libcxxabi/trunk/src/cxa_demangle.cpp Fri May 30 12:27:21 2014 > @@ -4847,32 +4847,33 @@ operator!=(const malloc_alloc<T>& x, con > 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; > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
