From b545663a3d91c16233ce34181475d8fd84e47034 Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@gmail.com>
Date: Sun, 19 Apr 2015 13:35:11 +0200
Subject: gcc2 fixes for tools, tests, layout.


diff --git a/source/layout/LETableReference.h b/source/layout/LETableReference.h
index de51228..f55b762 100644
--- a/source/layout/LETableReference.h
+++ b/source/layout/LETableReference.h
@@ -304,7 +304,11 @@ LE_TRACE_TR("INFO: new RTAO")
 
   le_uint32 getCount() const { return fCount; }
 
+#if __GNUC__ == 2
+  const T *getAlias() const { return LETableReference::getAlias(); }
+#else
   using LETableReference::getAlias;
+#endif
 
   const T *getAlias(le_uint32 i, LEErrorCode &success) const {
     return ((const T*)(((const char*)getAlias())+getOffsetFor(i, success)));
diff --git a/source/test/intltest/apicoll.cpp b/source/test/intltest/apicoll.cpp
index 31b16dd..3e2e4a8 100644
--- a/source/test/intltest/apicoll.cpp
+++ b/source/test/intltest/apicoll.cpp
@@ -1971,7 +1971,22 @@ class TestCollator  : public Collator
 public:
     virtual Collator* clone(void) const;
 
+#if __GNUC__ == 2
+	EComparisonResult compare (const UnicodeString& s1, const UnicodeString& s2)
+		const {
+		return Collator::compare(s1, s2);
+	}
+	EComparisonResult compare (const UnicodeString& s1, const UnicodeString& s2,
+			int32_t i) const {
+		return Collator::compare(s1, s2, i);
+	}
+	EComparisonResult compare (const UChar* s1, int32_t l1, const UChar* s2,
+		int32_t l2) const {
+		return Collator::compare(s1, l1, s2, l2);
+	}
+#else
     using Collator::compare;
+#endif
 
     virtual UCollationResult compare(const UnicodeString& source, 
                                       const UnicodeString& target,
diff --git a/source/test/iotest/stream.cpp b/source/test/iotest/stream.cpp
index a821636..083b4ab 100644
--- a/source/test/iotest/stream.cpp
+++ b/source/test/iotest/stream.cpp
@@ -131,7 +131,7 @@ static void U_CALLCONV TestStream(void)
 #endif
     UnicodeString ustr("string");
 
-    outFormatStream << "1234567890" << setw(10) << left << ustr << " " << "0123456789";
+    outFormatStream << "1234567890" << setw(10) << ios::left << ustr << " " << "0123456789";
 
 #ifdef USE_SSTREAM
     tempStr = outFormatStream.str();
diff --git a/source/tools/toolutil/udbgutil.cpp b/source/tools/toolutil/udbgutil.cpp
index 911425c..cdd6683 100644
--- a/source/tools/toolutil/udbgutil.cpp
+++ b/source/tools/toolutil/udbgutil.cpp
@@ -639,7 +639,9 @@ U_CAPI void udbg_knownIssue_close(void *ptr) {
 #include <set>
 #include <map>
 #include <string>
+#if __GNUC__ > 2
 #include <ostream>
+#endif
 #include <iostream>
 
 class KnownIssues {
-- 
2.2.2


From 6cafed065f5d91859be09b8a219c1eaf5785d96d Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@gmail.com>
Date: Sun, 19 Apr 2015 13:35:47 +0200
Subject: gcc2 fixes for sources/i18n


diff --git a/source/i18n/alphaindex.cpp b/source/i18n/alphaindex.cpp
index 9fa98b8..5535be2 100644
--- a/source/i18n/alphaindex.cpp
+++ b/source/i18n/alphaindex.cpp
@@ -952,8 +952,8 @@ static int32_t U_CALLCONV
 collatorComparator(const void *context, const void *left, const void *right) {
     const UElement *leftElement = static_cast<const UElement *>(left);
     const UElement *rightElement = static_cast<const UElement *>(right);
-    const UnicodeString *leftString  = static_cast<const UnicodeString *>(leftElement->pointer);
-    const UnicodeString *rightString = static_cast<const UnicodeString *>(rightElement->pointer);
+    const UnicodeString *leftString  = (const UnicodeString *)(leftElement->pointer);
+    const UnicodeString *rightString = (const UnicodeString *)(rightElement->pointer);
 
     if (leftString == rightString) {
         // Catches case where both are NULL
@@ -977,8 +977,8 @@ static int32_t U_CALLCONV
 recordCompareFn(const void *context, const void *left, const void *right) {
     const UElement *leftElement = static_cast<const UElement *>(left);
     const UElement *rightElement = static_cast<const UElement *>(right);
-    const AlphabeticIndex::Record *leftRec  = static_cast<const AlphabeticIndex::Record *>(leftElement->pointer);
-    const AlphabeticIndex::Record *rightRec = static_cast<const AlphabeticIndex::Record *>(rightElement->pointer);
+    const AlphabeticIndex::Record *leftRec  = (const AlphabeticIndex::Record *)(leftElement->pointer);
+    const AlphabeticIndex::Record *rightRec = (const AlphabeticIndex::Record *)(rightElement->pointer);
     const Collator *col = static_cast<const Collator *>(context);
     UErrorCode errorCode = U_ZERO_ERROR;
     return col->compare(leftRec->name_, rightRec->name_, errorCode);
diff --git a/source/i18n/currfmt.h b/source/i18n/currfmt.h
index b3f23e5..1495316 100644
--- a/source/i18n/currfmt.h
+++ b/source/i18n/currfmt.h
@@ -58,7 +58,9 @@ class CurrencyFormat : public MeasureFormat {
     virtual Format* clone() const;
 
 
+#if __GNUC__ > 2
     using MeasureFormat::format;
+#endif
 
     /**
      * Override Format API.
diff --git a/source/i18n/digitlst.cpp b/source/i18n/digitlst.cpp
index 51738be..c003c4b 100644
--- a/source/i18n/digitlst.cpp
+++ b/source/i18n/digitlst.cpp
@@ -38,7 +38,9 @@
 #include <limits.h>
 #include <string.h>
 #include <stdio.h>
+#if __GNUC__ > 2
 #include <limits>
+#endif
 
 // ***************************************************************************
 // class DigitList
@@ -437,11 +439,15 @@ DigitList::getDouble() const
             tDouble /= -1;
         }
     } else if (isInfinite()) {
+#if __GNUC__ <= 2
+		tDouble = DBL_MAX;
+#else
         if (std::numeric_limits<double>::has_infinity) {
             tDouble = std::numeric_limits<double>::infinity();
         } else {
             tDouble = std::numeric_limits<double>::max();
         }
+#endif
         if (!isPositive()) {
             tDouble = -tDouble; //this was incorrectly "-fDouble" originally.
         } 
diff --git a/source/i18n/digitlst.h b/source/i18n/digitlst.h
index 7e98d2b..4a95d71 100644
--- a/source/i18n/digitlst.h
+++ b/source/i18n/digitlst.h
@@ -413,7 +413,7 @@ private:
 
  public:
 
-#if U_OVERRIDE_CXX_ALLOCATION
+#if U_OVERRIDE_CXX_ALLOCATION && __GNUC__ > 2
     using UMemory::operator new;
     using UMemory::operator delete;
 #else
diff --git a/source/i18n/msgfmt.cpp b/source/i18n/msgfmt.cpp
index 32d9bc7..e6ca5c1 100644
--- a/source/i18n/msgfmt.cpp
+++ b/source/i18n/msgfmt.cpp
@@ -1484,6 +1484,7 @@ MessageFormat::parse(int32_t msgStart,
         prevIndex=msgPattern.getPart(argLimit).getLimit();
         i=argLimit;
     }
+	return NULL;
 }
 // -------------------------------------
 // Parses the source pattern and returns the Formattable objects array,
diff --git a/source/i18n/reldtfmt.h b/source/i18n/reldtfmt.h
index 67539e0..09f31e7 100644
--- a/source/i18n/reldtfmt.h
+++ b/source/i18n/reldtfmt.h
@@ -81,7 +81,9 @@ public:
     virtual UBool operator==(const Format& other) const;
 
 
+#if __GNUC__ > 2
     using DateFormat::format;
+#endif
 
     /**
      * Format a date or time, which is the standard millis since 24:00 GMT, Jan
diff --git a/source/i18n/sortkey.cpp b/source/i18n/sortkey.cpp
index baf3254..838ea82 100644
--- a/source/i18n/sortkey.cpp
+++ b/source/i18n/sortkey.cpp
@@ -172,7 +172,7 @@ Collator::EComparisonResult
 CollationKey::compareTo(const CollationKey& target) const
 {
     UErrorCode errorCode = U_ZERO_ERROR;
-    return static_cast<Collator::EComparisonResult>(compareTo(target, errorCode));
+    return (Collator::EComparisonResult)(compareTo(target, errorCode));
 }
 
 // Bitwise comparison for the collation keys.
diff --git a/source/i18n/unicode/choicfmt.h b/source/i18n/unicode/choicfmt.h
index cfd5206..d2b7f66 100644
--- a/source/i18n/unicode/choicfmt.h
+++ b/source/i18n/unicode/choicfmt.h
@@ -355,7 +355,22 @@ public:
     virtual const UnicodeString* getFormats(int32_t& count) const;
 
 
+#if __GNUC__ == 2
+    virtual UnicodeString& format (double number,
+                                   icu::UnicodeString& appendTo) const {
+        return NumberFormat::format(number, appendTo);
+    }
+	UnicodeString& format(const Formattable& f, UnicodeString& s,
+		FieldPosition& p, UErrorCode& e) const {
+		return NumberFormat::format(f, s, p, e);
+	}
+	UnicodeString& format(const Formattable& f, UnicodeString& s,
+		UErrorCode& e) const {
+		return NumberFormat::format(f, s, e);
+	}
+#else
     using NumberFormat::format;
+#endif
 
     /**
      * Formats a double number using this object's choices.
@@ -421,7 +436,13 @@ public:
                                   FieldPosition& pos,
                                   UErrorCode& success) const;
 
+#if __GNUC__ == 2
+	void parse(UnicodeString& s, Formattable& f, UErrorCode& e) const {
+		NumberFormat::parse(s, f, e);
+	}
+#else
    using NumberFormat::parse;
+#endif
 
    /**
     * Looks for the longest match of any message string on the input text and,
diff --git a/source/i18n/unicode/compactdecimalformat.h b/source/i18n/unicode/compactdecimalformat.h
index bd8fdba..be2e580 100644
--- a/source/i18n/unicode/compactdecimalformat.h
+++ b/source/i18n/unicode/compactdecimalformat.h
@@ -104,7 +104,13 @@ public:
     virtual UBool operator==(const Format& other) const;
 
 
+#if __GNUC__ == 2
+	UnicodeString& format(double n, UnicodeString& s) const {
+		return DecimalFormat::format(n, s);
+	}
+#else
     using DecimalFormat::format;
+#endif
 
     /**
      * Format a double or long number using base-10 representation.
diff --git a/source/i18n/unicode/datefmt.h b/source/i18n/unicode/datefmt.h
index 983f136..4531dc5 100644
--- a/source/i18n/unicode/datefmt.h
+++ b/source/i18n/unicode/datefmt.h
@@ -221,7 +221,13 @@ public:
     virtual UBool operator==(const Format&) const;
 
 
+#if __GNUC__ == 2
+	UnicodeString& format(const Formattable& f, UnicodeString& s, UErrorCode& e) const {
+		return Format::format(f, s, e);
+	}
+#else
     using Format::format;
+#endif
 
     /**
      * Format an object to produce a string. This method handles Formattable
diff --git a/source/i18n/unicode/decimfmt.h b/source/i18n/unicode/decimfmt.h
index 138855b..4ed2995 100644
--- a/source/i18n/unicode/decimfmt.h
+++ b/source/i18n/unicode/decimfmt.h
@@ -918,7 +918,35 @@ public:
     virtual UBool operator==(const Format& other) const;
 
 
+#if __GNUC__ == 2
+    virtual UnicodeString& format (double number,
+                                   icu::UnicodeString& appendTo) const {
+        return NumberFormat::format(number, appendTo);
+    }
+
+    virtual UnicodeString& format (double number,
+                                   icu::UnicodeString& appendTo,
+                                   UErrorCode& status) const {
+        return NumberFormat::format(number, appendTo, status);
+    }
+
+	UnicodeString& format(const Formattable& f, UnicodeString& s,
+			FieldPositionIterator* i, UErrorCode& e) const {
+		return NumberFormat::format(f, s, i, e);
+	}
+	
+	UnicodeString& format(const Formattable& f, UnicodeString& s,
+			FieldPosition& p, UErrorCode& e) const {
+		return NumberFormat::format(f, s, p, e);
+	}
+
+	UnicodeString& format(const Formattable& f, UnicodeString& s, UErrorCode& e)
+		const {
+		return NumberFormat::format(f, s, e);
+	}
+#else
     using NumberFormat::format;
+#endif
 
     /**
      * Format a double or long number using base-10 representation.
@@ -1131,7 +1159,15 @@ public:
                                   FieldPosition& pos,
                                   UErrorCode& status) const;
 
+#if __GNUC__ == 2
+    void parse(const UnicodeString& text,
+                       Formattable& result,
+                       UErrorCode& status) const {
+        NumberFormat::parse(text, result, status);
+    }
+#else
    using NumberFormat::parse;
+#endif
 
    /**
     * Parse the given string using this object's choices. The method
diff --git a/source/i18n/unicode/dtitvfmt.h b/source/i18n/unicode/dtitvfmt.h
index fb27eec..8fefb9e 100644
--- a/source/i18n/unicode/dtitvfmt.h
+++ b/source/i18n/unicode/dtitvfmt.h
@@ -373,7 +373,9 @@ public:
     UBool operator!=(const Format& other) const;
 
 
+#if __GNUC__ > 2
     using Format::format;
+#endif
 
     /**
      * Format an object to produce a string. This method handles Formattable
diff --git a/source/i18n/unicode/measfmt.h b/source/i18n/unicode/measfmt.h
index 61a1e86..0a272a8 100644
--- a/source/i18n/unicode/measfmt.h
+++ b/source/i18n/unicode/measfmt.h
@@ -92,8 +92,25 @@ class DateFormat;
  */
 class U_I18N_API MeasureFormat : public Format {
  public:
+#if __GNUC__ == 2
+	void parseObject (const UnicodeString& s, Formattable& f, UErrorCode& e) 
+		const {
+		Format::parseObject(s, f, e);
+	}
+
+	UnicodeString& format(const Formattable& f, UnicodeString& s,
+		FieldPositionIterator* i, UErrorCode& e) const {
+		return Format::format(f, s, i, e);
+	}
+
+	UnicodeString& format(const Formattable& f, UnicodeString& s,
+		UErrorCode& e) const {
+		return Format::format(f, s, e);
+	}
+#else
     using Format::parseObject;
     using Format::format;
+#endif
 
     /**
      * Constructor.
diff --git a/source/i18n/unicode/msgfmt.h b/source/i18n/unicode/msgfmt.h
index 5de91e4..8f9f995 100644
--- a/source/i18n/unicode/msgfmt.h
+++ b/source/i18n/unicode/msgfmt.h
@@ -622,7 +622,17 @@ public:
     virtual const Format** getFormats(int32_t& count) const;
 
 
+#if __GNUC__ == 2
+	UnicodeString& format(const Formattable& f, UnicodeString& s,
+		FieldPositionIterator* i, UErrorCode& e) const {
+		return Format::format(f, s, i, e);
+	}
+	UnicodeString& format(const Formattable& f, UnicodeString& s, UErrorCode& e) {
+		return Format::format(f, s, e);
+	}
+#else
     using Format::format;
+#endif
 
     /**
      * Formats the given array of arguments into a user-readable string.
@@ -884,6 +894,9 @@ private:
         PluralRules* rules;
         UPluralType type;
     };
+#if __GNUC__ == 2
+	friend class PluralSelectorProvider;
+#endif
 
     /**
      * A MessageFormat formats an array of arguments.  Each argument
diff --git a/source/i18n/unicode/numfmt.h b/source/i18n/unicode/numfmt.h
index 164c657..4b03222 100644
--- a/source/i18n/unicode/numfmt.h
+++ b/source/i18n/unicode/numfmt.h
@@ -235,7 +235,15 @@ public:
     virtual UBool operator==(const Format& other) const;
 
 
+#if __GNUC__ == 2
+    virtual UnicodeString& format (const Formattable& obj,
+                                   UnicodeString& appendTo,
+                                   UErrorCode & status) const {
+        return Format::format(obj, appendTo, status);
+    }
+#else
     using Format::format;
+#endif
 
     /**
      * Format an object to produce a string.  This method handles
diff --git a/source/i18n/unicode/plurfmt.h b/source/i18n/unicode/plurfmt.h
index f7099d8..bedaf01 100644
--- a/source/i18n/unicode/plurfmt.h
+++ b/source/i18n/unicode/plurfmt.h
@@ -313,7 +313,14 @@ public:
     void applyPattern(const UnicodeString& pattern, UErrorCode& status);
 
 
+#if __GNUC__ == 2
+	UnicodeString& format(const Formattable& f, UnicodeString& s,
+		FieldPositionIterator* i, UErrorCode& e) const {
+		return Format::format(f, s, i, e);
+	}
+#else
     using Format::format;
+#endif
 
     /**
      * Formats a plural message for a given number.
diff --git a/source/i18n/unicode/rbnf.h b/source/i18n/unicode/rbnf.h
index 7058c96..d0ad947 100644
--- a/source/i18n/unicode/rbnf.h
+++ b/source/i18n/unicode/rbnf.h
@@ -741,7 +741,23 @@ public:
                           const Locale& locale = Locale::getDefault());
 
 
+#if __GNUC__ == 2
+  UnicodeString& format(const Formattable& f, UnicodeString& s, UErrorCode& e)
+	const {
+		return NumberFormat::format(f, s, e);
+  }
+
+  UnicodeString& format(double n, UnicodeString& s) const {
+	return NumberFormat::format(n, s);
+  }
+
+  UnicodeString& format(int64_t n, UnicodeString& s, FieldPosition& p,
+	UErrorCode& e) const {
+	return NumberFormat::format(n, s, p, e);
+  }
+#else
   using NumberFormat::format;
+#endif
 
   /**
    * Formats the specified 32-bit number using the default ruleset.
@@ -827,7 +843,13 @@ public:
                                 FieldPosition& pos,
                                 UErrorCode& status) const;
 
+#if __GNUC__ == 2
+  void parse(const UnicodeString& s, Formattable& f, UErrorCode& e) const {
+	return NumberFormat::parse(s, f, e);
+  }
+#else
   using NumberFormat::parse;
+#endif
 
   /**
    * Parses the specfied string, beginning at the specified position, according
diff --git a/source/i18n/unicode/selfmt.h b/source/i18n/unicode/selfmt.h
index 635144b..7247839 100644
--- a/source/i18n/unicode/selfmt.h
+++ b/source/i18n/unicode/selfmt.h
@@ -219,7 +219,9 @@ public:
     void applyPattern(const UnicodeString& pattern, UErrorCode& status);
 
 
+#if __GNUC__ > 2
     using Format::format;
+#endif
 
     /**
      * Selects the phrase for  the given keyword
@@ -340,9 +342,9 @@ public:
      */
     virtual UClassID getDynamicClassID() const;
 
-private:
     friend class MessageFormat;
 
+private:
     SelectFormat();   // default constructor not implemented.
 
     /**
diff --git a/source/i18n/unicode/smpdtfmt.h b/source/i18n/unicode/smpdtfmt.h
index ccdaff4..69f70ec 100644
--- a/source/i18n/unicode/smpdtfmt.h
+++ b/source/i18n/unicode/smpdtfmt.h
@@ -870,7 +870,27 @@ public:
     virtual UBool operator==(const Format& other) const;
 
 
+#if __GNUC__ == 2
+	UnicodeString& format(const Formattable& f, UnicodeString& s,
+		FieldPositionIterator* i, UErrorCode& e) const {
+		return DateFormat::format(f, s, i, e);
+	}
+	UnicodeString& format(const Formattable& f, UnicodeString& s, FieldPosition& p,
+		UErrorCode& e) const {
+		return DateFormat::format(f, s, p, e);
+	}
+	UnicodeString& format(const Formattable& f, UnicodeString& s, UErrorCode& e) const {
+		return Format::format(f, s, e);
+	}
+	UnicodeString& format(const UDate& d, UnicodeString& s, FieldPosition& f) const {
+		return DateFormat::format(d, s, f);
+	}
+	UnicodeString& format(const UDate& d, UnicodeString& s) const {
+		return DateFormat::format(d, s);
+	}
+#else
     using DateFormat::format;
+#endif
 
     /**
      * Format a date or time, which is the standard millis since 24:00 GMT, Jan
@@ -915,7 +935,16 @@ public:
                                     FieldPositionIterator* posIter,
                                     UErrorCode& status) const;
 
+#if __GNUC__ == 2
+	UDate parse(const UnicodeString& s, UErrorCode& e) const {
+		return DateFormat::parse(s, e);
+	}
+	UDate parse (const UnicodeString& s, ParsePosition& p) const {
+		return DateFormat::parse(s, p);
+	}
+#else
     using DateFormat::parse;
+#endif
 
     /**
      * Parse a date/time string beginning at the given parse position. For
diff --git a/source/i18n/unicode/tblcoll.h b/source/i18n/unicode/tblcoll.h
index e56f189..2108699 100644
--- a/source/i18n/unicode/tblcoll.h
+++ b/source/i18n/unicode/tblcoll.h
@@ -254,7 +254,22 @@ public:
                                          const CharacterIterator& source) const;
 
     // Make deprecated versions of Collator::compare() visible.
+#if __GNUC__ == 2
+	EComparisonResult compare(const UChar* source, int sourceLength,
+		const UChar* target, int targetLength) const {
+		return Collator::compare(source, sourceLength, target, targetLength);
+	}
+	EComparisonResult compare(const UnicodeString& s1, const UnicodeString& s2,
+		int i) const {
+		return Collator::compare(s1, s2, i);
+	}
+	EComparisonResult compare(const UnicodeString& s1, const UnicodeString& s2)
+		const {
+		return Collator::compare(s1, s2);
+	}
+#else
     using Collator::compare;
+#endif
 
     /**
     * The comparison function compares the character data stored in two
diff --git a/source/i18n/unicode/tzfmt.h b/source/i18n/unicode/tzfmt.h
index 24f0e49..969e08a 100644
--- a/source/i18n/unicode/tzfmt.h
+++ b/source/i18n/unicode/tzfmt.h
@@ -520,7 +520,14 @@ public:
      */
     UnicodeString& formatOffsetShortLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const;
 
+#if __GNUC__ == 2
+	UnicodeString& format(const Formattable& data, UnicodeString& string,
+		FieldPositionIterator* iterator, UErrorCode& error) const {
+		return Format::format(data, string, iterator, error);
+	}
+#else
     using Format::format;
+#endif
 
     /**
      * Returns the display name of the time zone at the given date for the style.
-- 
2.2.2


From 6fe3c3f205284dfb0a2c4d06717bb84cb61f0f66 Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@gmail.com>
Date: Sun, 19 Apr 2015 13:36:37 +0200
Subject: gcc2 fixes in source/common


diff --git a/source/common/unicode/bytestrie.h b/source/common/unicode/bytestrie.h
index 9c77827..367a0ae 100644
--- a/source/common/unicode/bytestrie.h
+++ b/source/common/unicode/bytestrie.h
@@ -338,6 +338,9 @@ public:
         // but the code looks more confusing that way.)
         UVector32 *stack_;
     };
+#if __GNUC__ == 2
+	friend class Iterator;
+#endif
 
 private:
     friend class BytesTrieBuilder;
diff --git a/source/common/unicode/bytestriebuilder.h b/source/common/unicode/bytestriebuilder.h
index d00ab9b..afbf59b 100644
--- a/source/common/unicode/bytestriebuilder.h
+++ b/source/common/unicode/bytestriebuilder.h
@@ -152,6 +152,9 @@ private:
     private:
         const char *s;
     };
+#if __GNUC__ == 2
+	friend class BTLinearMatchNode;
+#endif
 
     virtual Node *createLinearMatchNode(int32_t i, int32_t byteIndex, int32_t length,
                                         Node *nextNode) const;
diff --git a/source/common/unicode/platform.h b/source/common/unicode/platform.h
index 4829000..2411dd0 100644
--- a/source/common/unicode/platform.h
+++ b/source/common/unicode/platform.h
@@ -708,7 +708,7 @@
     /* Use the predefined value. */
 #elif defined(U_STATIC_IMPLEMENTATION)
 #   define U_EXPORT
-#elif defined(__GNUC__)
+#elif defined(__GNUC__) && __GNUC__ > 2
 #   define U_EXPORT __attribute__((visibility("default")))
 #elif (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x550) \
    || (defined(__SUNPRO_C) && __SUNPRO_C >= 0x550) 
diff --git a/source/common/unicode/stringtriebuilder.h b/source/common/unicode/stringtriebuilder.h
index 04447e5..21bab82 100644
--- a/source/common/unicode/stringtriebuilder.h
+++ b/source/common/unicode/stringtriebuilder.h
@@ -379,6 +379,15 @@ protected:
         int32_t length;
         Node *next;  // A branch sub-node.
     };
+#if __GNUC__ >= 2
+	friend class FinalValueNode;
+	friend class ValueNode;
+	friend class IntermediateValueNode;
+	friend class BranchNode;
+	friend class ListBranchNode;
+	friend class SplitBranchNode;
+	friend class BranchHeadNode;
+#endif
 #endif  /* U_HIDE_INTERNAL_API */
 
     /** @internal */
diff --git a/source/common/unicode/ucharstrie.h b/source/common/unicode/ucharstrie.h
index 0575a97..9fe81c1 100644
--- a/source/common/unicode/ucharstrie.h
+++ b/source/common/unicode/ucharstrie.h
@@ -356,6 +356,9 @@ public:
         // but the code looks more confusing that way.)
         UVector32 *stack_;
     };
+#if __GNUC__ == 2
+	friend class Iterator;
+#endif
 
 private:
     friend class UCharsTrieBuilder;
diff --git a/source/common/unicode/ucharstriebuilder.h b/source/common/unicode/ucharstriebuilder.h
index 35e353d..30f40d9 100644
--- a/source/common/unicode/ucharstriebuilder.h
+++ b/source/common/unicode/ucharstriebuilder.h
@@ -156,6 +156,9 @@ private:
     private:
         const UChar *s;
     };
+#if __GNUC__ == 2
+	friend class UCTLinearMatchNode;
+#endif
 
     virtual Node *createLinearMatchNode(int32_t i, int32_t unitIndex, int32_t length,
                                         Node *nextNode) const;
-- 
2.2.2


From efa9ee8612ac7482e56fa2190ce1b1afd188e268 Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@gmail.com>
Date: Mon, 6 Oct 2014 13:28:09 +0200
Subject: more gcc2 fixes for ICU 54.


diff --git a/source/common/norm2allmodes.h b/source/common/norm2allmodes.h
index 64c84a2..aca1e08 100644
--- a/source/common/norm2allmodes.h
+++ b/source/common/norm2allmodes.h
@@ -193,7 +193,9 @@ private:
               ReorderingBuffer &buffer, UErrorCode &errorCode) const {
         impl.decompose(src, limit, &buffer, errorCode);
     }
+#if __GNUC__ != 2
     using Normalizer2WithImpl::normalize;  // Avoid warning about hiding base class function.
+#endif
     virtual void
     normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize,
                        UnicodeString &safeMiddle,
@@ -204,7 +206,9 @@ private:
     spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const {
         return impl.decompose(src, limit, NULL, errorCode);
     }
+#if __GNUC__ != 2
     using Normalizer2WithImpl::spanQuickCheckYes;  // Avoid warning about hiding base class function.
+#endif
     virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const {
         return impl.isDecompYes(impl.getNorm16(c)) ? UNORM_YES : UNORM_NO;
     }
@@ -225,7 +229,9 @@ private:
               ReorderingBuffer &buffer, UErrorCode &errorCode) const {
         impl.compose(src, limit, onlyContiguous, TRUE, buffer, errorCode);
     }
+#if __GNUC__ != 2
     using Normalizer2WithImpl::normalize;  // Avoid warning about hiding base class function.
+#endif
     virtual void
     normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize,
                        UnicodeString &safeMiddle,
@@ -268,7 +274,9 @@ private:
     spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &) const {
         return impl.composeQuickCheck(src, limit, onlyContiguous, NULL);
     }
+#if __GNUC__ != 2
     using Normalizer2WithImpl::spanQuickCheckYes;  // Avoid warning about hiding base class function.
+#endif
     virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const {
         return impl.getCompQuickCheck(impl.getNorm16(c));
     }
@@ -296,7 +304,9 @@ private:
               ReorderingBuffer &buffer, UErrorCode &errorCode) const {
         impl.makeFCD(src, limit, &buffer, errorCode);
     }
+#if __GNUC__ != 2
     using Normalizer2WithImpl::normalize;  // Avoid warning about hiding base class function.
+#endif
     virtual void
     normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize,
                        UnicodeString &safeMiddle,
@@ -307,7 +317,9 @@ private:
     spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const {
         return impl.makeFCD(src, limit, NULL, errorCode);
     }
+#if __GNUC__ != 2
     using Normalizer2WithImpl::spanQuickCheckYes;  // Avoid warning about hiding base class function.
+#endif
     virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasFCDBoundaryBefore(c); }
     virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasFCDBoundaryAfter(c); }
     virtual UBool isInert(UChar32 c) const { return impl.isFCDInert(c); }
diff --git a/source/common/putilimp.h b/source/common/putilimp.h
index a3e361f..affb1a8 100644
--- a/source/common/putilimp.h
+++ b/source/common/putilimp.h
@@ -113,7 +113,7 @@ typedef size_t uintptr_t;
 
 #if defined(U_TIMEZONE) || defined(U_HAVE_TIMEZONE)
     /* Use the predefined value. */
-#elif U_PLATFORM == U_PF_ANDROID
+#elif U_PLATFORM == U_PF_ANDROID || defined(__HAIKU__)
 #   define U_TIMEZONE timezone
 #elif U_PLATFORM_IS_LINUX_BASED
 #   if defined(__UCLIBC__)
diff --git a/source/common/unicode/platform.h b/source/common/unicode/platform.h
index 2411dd0..61fdfe1 100644
--- a/source/common/unicode/platform.h
+++ b/source/common/unicode/platform.h
@@ -159,7 +159,7 @@
 #   else
 #       define U_PLATFORM U_PF_DARWIN
 #   endif
-#elif defined(BSD) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__MirBSD__)
+#elif defined(BSD) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__MirBSD__) || defined(__HAIKU__)
 #   define U_PLATFORM U_PF_BSD
 #elif defined(sun) || defined(__sun)
     /* Check defined(__SVR4) || defined(__svr4__) to distinguish Solaris from SunOS? */
diff --git a/source/i18n/filteredbrk.cpp b/source/i18n/filteredbrk.cpp
index 7ecb004..e3b3802 100644
--- a/source/i18n/filteredbrk.cpp
+++ b/source/i18n/filteredbrk.cpp
@@ -65,7 +65,13 @@ class U_I18N_API UStringSet : public UVector {
   inline UBool contains(const UnicodeString& s) {
     return contains((void*) &s);
   }
+#if __GNUC__ == 2
+  UBool contains(void* s) {
+	  return UVector::contains(s);
+  }
+#else
   using UVector::contains;
+#endif
   /**
    * Return the ith UnicodeString alias
    */
-- 
2.2.2


From d1ec5200e5938bab93750e171a58182ea76eebc1 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Thu, 26 Mar 2015 18:39:42 +0000
Subject: gcc2 fixes for tztools.


diff --git a/source/tools/tzcode/private.h b/source/tools/tzcode/private.h
index 1a85c88..0ee3329 100644
--- a/source/tools/tzcode/private.h
+++ b/source/tools/tzcode/private.h
@@ -120,7 +120,7 @@
 */
 #ifndef HAVE_STDINT_H
 #define HAVE_STDINT_H \
-	(199901 <= __STDC_VERSION__ || \
+	(defined(__HAIKU__) || 199901 <= __STDC_VERSION__ || \
 	2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
 #endif /* !defined HAVE_STDINT_H */
 
-- 
2.2.2

