diff options
author | Sami Wagiaalla <swagiaal@redhat.com> | 2010-05-07 14:46:28 +0000 |
---|---|---|
committer | Sami Wagiaalla <swagiaal@redhat.com> | 2010-05-07 14:46:28 +0000 |
commit | 7322dca9c16dfce7e9019240ac21037f2a4d6cb7 (patch) | |
tree | 15ef1ee23eb0d09d802c4f8fc1424b430d2a76f8 /gdb/testsuite/gdb.cp/koenig.cc | |
parent | 3f1f688424574eaba15256ec436b564a8e2e8c20 (diff) | |
download | binutils-7322dca9c16dfce7e9019240ac21037f2a4d6cb7.zip binutils-7322dca9c16dfce7e9019240ac21037f2a4d6cb7.tar.gz binutils-7322dca9c16dfce7e9019240ac21037f2a4d6cb7.tar.bz2 |
Add ADL support
2010-05-07 Sami Wagiaalla <swagiaal@redhat.com>
PR C++/7943:
* valops.c (find_overload_match): Handle fsym == NULL case.
Add int no_adl argument.
(find_oload_champ_namespace_loop): Call make_symbol_overload_list_adl
when appropriate.
Add int no_adl argument.
(find_oload_champ_namespace): Add int no_adl argument.
* parse.c (operator_length_standard): Return length for OP_ADL_FUNC
expression.
* expprint.c (op_name_standard): Added string for OP_ADL_FUNC case.
* eval.c (evaluate_subexp_standard): Added OP_ADL_FUNC case.
Evaluate arguments and use them to perform ADL lookup.
Pass no_adl argument to find_overload_match.
Disable adl lookup when evaluating a fully qualified OP_FUNCALL.
* cp-support.h: Added prototype for
make_symbol_overload_list_namespace.
* cp-support.c (make_symbol_overload_list_namespace): New function.
(make_symbol_overload_list_adl_namespace): New function.
(make_symbol_overload_list_adl): New function.
(make_symbol_overload_list_using): Moved code to add function to
overload set to make_symbol_overload_list_namespace.
* c-exp.y: create UNKNOWN_CPP_NAME token.
Add parse rule for ADL functions.
(classify_name): Recognize an UNKNOWN_CPP_NAME.
2010-05-07 Sami Wagiaalla <swagiaal@redhat.com>
* gdb.cp/koenig.exp: New test.
* gdb.cp/koenig.cc: New test program.
Diffstat (limited to 'gdb/testsuite/gdb.cp/koenig.cc')
-rw-r--r-- | gdb/testsuite/gdb.cp/koenig.cc | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.cp/koenig.cc b/gdb/testsuite/gdb.cp/koenig.cc new file mode 100644 index 0000000..6cfa3f5 --- /dev/null +++ b/gdb/testsuite/gdb.cp/koenig.cc @@ -0,0 +1,245 @@ +namespace A +{ + class C + { + public: + static const int x = 11; + }; + + int + first (C c) + { + return 11; + } + + int + first (int a, C c) + { + return 22; + } + + int + second (int a, int b, C cc, int c, int d) + { + return 33; + } + +} + +struct B +{ + A::C c; +}; + +//------------ + +namespace E +{ + class O{}; + int foo (O o){return 1; } + int foo (O o, O o2){return 2; } + int foo (O o, O o2, int i){return 3; } +} + +namespace F +{ + class O{}; + int foo ( O fo, ::E::O eo){ return 4;} + int foo (int i, O fo, ::E::O eo){ return 5;} +} + +namespace G +{ + class O{}; + int foo (O go, ::F::O fo, ::E::O eo){ return 6; } +} + +//------------ + +namespace H +{ + class O{}; + int foo (O){ return 7;} +} + +namespace I +{ + class O: public H::O {}; + class X: H::O{}; +} + +//------------ + +namespace J +{ + union U{}; + struct S{}; + enum E{}; + + class A{ + public: + class B{}; + }; + + class C{}; + + int foo (U){ return 8;} + int foo (S){ return 9;} + int foo (E){ return 10;} + int foo (A::B){ return 11;} + int foo (A*){ return 12;} + int foo (A**){ return 13;} + int foo (C[]){ return 14;} + +} +//------------ + +namespace K{ + class O{}; + + int foo(O, int){ + return 15; + } + + int bar(O, int){ + return 15; + } +} + +int foo(K::O, float){ + return 16; +} + +int bar(K::O, int){ + return 16; +} +//------------ + +namespace L { + namespace A{ + namespace B{ + class O {}; + + int foo (O){ + return 17; + } + + } + } +} + +//------------ + +namespace M { + class A{ + public: + int foo(char) { + return 18; + } + }; + + int foo(A,char){ + return 19; + } + + int foo(A *,char){ + return 23; + } + + int bar(char){ + return 21; + } + + namespace N { + int foo(::M::A,int){ + return 20; + } + + int bar(int){ + return 22; + } + } +} +//------------ + +namespace O { + class A{}; + + int foo(A,int){ + return 23; + } + +} + +typedef O::A TOA; +typedef TOA TTOA; + +//------------ +int +main () +{ + A::C c; + B b; + + A::first (c); + first (0, c); + second (0, 0, c, 0, 0); + A::first (b.c); + + E::O eo; + F::O fo; + G::O go; + + foo (eo); + foo (eo, eo); + foo (eo, eo, 1); + foo (fo, eo); + foo (1 ,fo, eo); + foo (go, fo, eo); + + I::O io; + I::X ix; + + foo (io); +//foo (ix); + + J::U ju; + J::S js; + J::E je; + J::A::B jab; + J::A *jap; + J::A **japp; + J::C jca[3]; + + foo (ju); + foo (js); + foo (je); + foo (jab); + foo (jap); + foo (japp); + foo (jca); + + K::O ko; + foo (ko, 1); + foo (ko, 1.0f); + //bar(ko,1); + + L::A::B::O labo; + foo (labo); + + M::A ma; + foo(ma,'a'); + ma.foo('a'); + M::N::foo(ma,'a'); + + M::bar('a'); + M::N::bar('a'); + + TTOA ttoa; + foo (ttoa, 'a'); + + return first (0, c) + foo (eo) + + foo (eo, eo) + foo (eo, eo, 1) + + foo (fo, eo) + foo (1 ,fo, eo) + + foo (go, fo, eo); +} |