| // { dg-do assemble } |
| // { dg-options "-Wno-deprecated -Wno-return-type" } |
| /* bug.cc */ |
| /* simple program to demonstrate the bug with named return values in gcc |
| */ |
| /* (w) 4.9.97 by Kurt Garloff <K.Garloff@ping.de> */ |
| // 8/28/1998 - This dies in add_conversions from dfs_walk, null CLASSTYPE_METHOD_VEC |
| // for the test<T> record_type. This is marked as an expected failure for now, |
| // until we actually fix it. |
| |
| #include <iostream> |
| |
| template <class T> class test; |
| template <class T> test<T> operator + (const test<T>& a, const test<T>& b); |
| |
| // A simple numerical class |
| template <class T> |
| class test |
| { |
| T elem; |
| public: |
| test () { elem = 0; }; |
| test (const T& a) { elem = a; }; |
| test<T>& operator += (const test<T>& a) { elem += a.elem; return *this; }; |
| friend test<T> operator + <> (const test<T>&, const test<T>&); |
| friend std::ostream& operator << (std::ostream& os, const test<T>& a) |
| { return os << a.elem; }; |
| }; |
| |
| // named return value version |
| template <class T> |
| test<T> operator + (const test<T>& a, const test<T>& b) return c(a);// { dg-error "" } named return value |
| { c += b; } // { dg-error "" } c undeclared |
| |
| int main() |
| { |
| test<int> x, y; |
| x += 5; |
| std::cout << x << std::endl; |
| y = x + test<int>(2); |
| std::cout << y << std::endl; |
| return 0; |
| } |