comparison test/cedet/tests/test.cpp @ 105267:c99cf31de3f2

Add CEDET tests.
author Chong Yidong <cyd@stupidchicken.com>
date Mon, 28 Sep 2009 23:23:31 +0000
parents
children 7f4c7f5c0eba
comparison
equal deleted inserted replaced
105266:c02e98221afe 105267:c99cf31de3f2
1 /* Test file for C++ language.
2 * Attempt to include as many aspects of the C++ language as possible.
3 * Do not include things tested in test.c since that shares the
4 * same language.
5 *
6 * $Id: test.cpp,v 1.1.2.1 2009/09/20 04:00:17 cyd Exp $
7 *
8 */
9
10 /* An include test */
11 #include <stdio.h>
12
13 #include <cmath>
14
15 #include "c++-test.hh"
16
17 #include <c++-test.hh>
18
19 double var1 = 1.2;
20
21 int simple1(int a) {
22
23 }
24
25 struct foo1 {
26 int test;
27 };
28
29 struct foo2 : public foo1 {
30 const int foo21(int a, int b);
31 const int foo22(int a, int b) { return 1 }
32 };
33
34 /* Classes */
35 class class1 {
36 private:
37 int var11;
38 struct foo1 var12;
39 public:
40 int p_var11;
41 struct foo p_var12;
42 };
43
44 class i_class1 : public class1 {
45 private:
46 int var11;
47 struct foo var12;
48 public:
49 int p_var11;
50 struct foo p_var12;
51 };
52
53 class class2 {
54 private:
55 int var21;
56 struct foo var22;
57 public:
58 int p_var21;
59 struct foo p_var22;
60 };
61
62 class i_class2 : public class1, public class2 {
63 private:
64 int var21;
65 struct foo var22;
66 protected:
67 int pt_var21;
68 public:
69 int p_var21;
70 struct foo p_var22;
71 };
72
73 class class3 {
74 /* A class with strange things in it */
75 public:
76 class3(); /* A constructor */
77 enum embedded_foo_enum {
78 a, b, c
79 } embed1;
80 struct embedded_bar_struct {
81 int a;
82 int b;
83 } embed2;
84 class embedded_baz_class {
85 embedded_baz_class();
86 ~embedded_baz_class();
87 } embed3;
88 ~class3(); /* destructor */
89
90 /* Methods */
91 int method_for_class3(int a, char b);
92
93 int inline_method(int c) { return c; }
94
95 /* Operators */
96 class3& operator^= (const class3& something);
97
98 /* Funny declmods */
99 const class3 * const method_const_ptr_ptr(const int * const argconst) const = 0;
100 };
101
102 class3::class3()
103 {
104 /* Constructor outside the definition. */
105 }
106
107 int class3::method_for_class3(int a, char b)
108 {
109 }
110
111 int class3::method1_for_class3( int a, int &b)
112 {
113 int cvariablename;
114 class3 fooy[];
115 class3 moose = new class3;
116
117 // Complktion testing line should find external members.
118 a = fooy[1].me ;
119 b = cv ;
120
121 if (fooy.emb) {
122 simple1(c);
123 }
124
125 cos(10);
126 abs(10);
127
128 return 1;
129 }
130
131 char class3::method2_for_class3( int a, int b) throw ( exception1 )
132 {
133 return 'a';
134 }
135
136 void *class3::method3_for_class3( int a, int b) throw ( exception1, exception2 )
137 {
138 int q = a;
139 return "Moose";
140 }
141
142 void *class3::method31_for_class3( int a, int b) throw ( )
143 {
144 int q = a;
145 return "Moose";
146 }
147
148 void *class3::method4_for_class3( int a, int b) reentrant
149 {
150 class3 ct;
151
152 ct.method5_for_class3(1,a);
153
154 pritf();
155 }
156
157 /*
158 * A method on class3.
159 */
160 void *class3::method5_for_class3( int a, int b) const
161 {
162 }
163
164 /*
165 * Namespace parsing tests
166 */
167 namespace NS {
168 class class_in_namespace {
169 int equiv(const NS::class_in_namespace *) const;
170 };
171 }
172
173 int NS::class_in_namespace::equiv(const NS::class_in_namespace *cin) const
174 {
175 return 0;
176 }
177
178 // Stuff Klaus found.
179 // Inheritance w/out a specifying for public.
180 class class4 : class1 {
181 // Pure virtual methods.
182 void virtual print () const = 0;
183
184 public:
185 // The whacky constructor type
186 class4()
187 try : class1(args)
188 {
189 // constructor body
190 }
191 catch ()
192 {
193
194 }
195
196
197 };
198
199 class class5 : public virtual class4 {
200 // Virtual inheritance
201 };
202
203 class class6 : class1 {
204 // Mutable
205 mutable int i;
206 };
207
208 /* Namespaces */
209 namespace namespace1 {
210 void ns_method1() { }
211
212 class n_class1 {
213 public:
214 void method11(int a) { }
215 };
216
217 /* This shouldn't parse due to missing semicolon. */
218 class _n_class2 : public n_class1 {
219 void n_c2_method1(int a, int b) { }
220 };
221
222 // Macros in the namespace
223 #define NSMACRO 1
224
225 // Template in the namespace
226 template<class T> T nsti1(const Foo& foo);
227 template<> int nsti1<int>(const Foo& foo);
228
229 }
230
231 namespace namespace2 {
232
233 using namespace1::n_class1;
234
235 }
236
237 /* Initializers */
238 void tinitializers1(): inita1(False),
239 inita2(False)
240 {
241 inita1= 1;
242 }
243
244 /* How about Extern C type things. */
245 int funny_prototype(int ,int b,float c)
246 {
247
248 }
249
250 extern "C"
251 int extern_c_1(int a, int b)
252 {
253
254 funny_prototype(1,2,3.4);
255
256 printf("Moose", );
257
258 return 1;
259 }
260
261 extern "C" {
262
263 int extern_c_2(int a, int b)
264 {
265 return 1;
266 }
267
268 }
269
270 // Some operator stuff
271 class Action
272 {
273 // Problems!! operator() and operator[] can not be parsed with semantic
274 // 1.4.2 but with latest c.by
275 virtual void operator()(int i, char *p ) = 0;
276 virtual String& operator[]() = 0;
277 virtual void operator!() = 0;
278 virtual void operator->() = 0;
279 virtual T& operator+=();
280 virtual T& operator*();
281 virtual T& operator*=();
282 };
283
284 // class with namespace qualified parents
285 class Multiinherit : public virtual POA::Parent,
286 public virtual POA::Parent1,
287 Parent
288 {
289 private:
290 int i;
291
292 public:
293 Multiinherit();
294 ~Multiinherit();
295
296 // method with a list of qualified exceptions
297 void* throwtest()
298 throw(Exception0,
299 Testnamespace::Exception1,
300 Testnamespace::Excpetion2,
301 Testnamespace::testnamespace1::Exception3);
302
303 };
304
305 void*
306 Multiinherit::throwtest()
307 throw (Exception0,
308 Testnamespace::Exception1,
309 Testnamespace::Excpetion2,
310 Testnamespace::testnamespace1::Exception3)
311 {
312 return;
313 }
314
315 // Jens Rock <jens.rock@asamnet.de>: Nested classes or structs defined
316 // outside of the containing class/struct.
317 class container
318 {
319 public:
320 struct contained;
321 container();
322 ~container();
323 };
324
325 struct container::contained
326 {
327 public:
328 contained();
329 ~contained();
330 };
331
332 /*
333 * Ok, how about some template stuff.
334 */
335 template <class CT, class container = vector<CT> >
336 const CT& max (const CT& a, const CT& b)
337 {
338 return a < b ? b : a;
339 }
340
341 // Arne Schmitz found this one
342 std::vector<int> &a, &b, &c;
343
344 class TemplateUsingClass
345 {
346 typedef TestClassMap::iterator iterator;
347 typedef map<long, long> TestClassMap;
348
349 // typedefs with const and volatile
350 typedef const map<long, long> const_TestClassMap;
351 typedef TestClassMap<string>::iterator volatile volatile_iterator;
352
353 map<int, int> mapclassvarthingy;
354 };
355
356 template<class T> T ti1(const Foo& foo);
357 template<> int ti1<int>(const Foo& foo);
358
359
360 // -----------------------------------
361 // Now some namespace and related stuff
362 // -----------------------------------
363
364 using CORBA::LEX::get_token;
365 using Namespace1;
366
367 using namespace POA::std;
368 using namespace Test;
369
370
371
372 namespace Parser
373 {
374 namespace
375 {
376 using Lexer::get_test;
377 string str = "";
378 }
379
380 namespace XXX
381 {
382
383 class Foobar : public virtual POA::Parent,
384 public virtual POA::Parent1,
385 private POA::list<fact>,
386 private map<string>
387 {
388 ini i;
389 list <shared_ptr<item> >::const_iterator l;
390 public:
391
392 Foobar();
393 ~Foobar();
394 };
395 }
396
397
398 void test_function(int i);
399
400 };
401
402 // unnamed namespaces - even nested
403 namespace
404 {
405 namespace
406 {
407 using Lexer::get_test;
408 string str = "";
409 }
410
411 // some builtin types
412 long long ll = 0;
413 long double d = 0.0;
414 unsigned test;
415 unsigned long int **uli = 0;
416 signed si = 0;
417 signed short ss = 0;
418 short int i = 0;
419 long int li = 0;
420
421 // expressions with namespace/class-qualifyiers
422 ORB_var cGlobalOrb = ORB::_nil();
423 ORB_var1 cGlobalOrb1 = ORB::_test;
424
425 class Testclass
426 {
427 #define TEST 0
428 ini i;
429
430 public:
431
432 Testclass();
433 ~Testclass();
434 };
435
436 static void test_function(unsigned int i);
437
438 };
439
440
441 // outside method implementations which should be grouped to type Test
442 XXX&
443 Test::waiting()
444 {
445 return;
446 }
447
448 void
449 Test::print()
450 {
451 return;
452 }
453
454 // outside method implementations with namespaces which should be grouped to
455 // their complete (incl. namespace) types
456 void*
457 Parser::XXX::Foobar::wait(int i, const char const * const * p)
458 {
459 return;
460 }
461
462 void*
463 Namespace1::Test::wait1(int i)
464 {
465 return;
466 }
467
468 int
469 Namespace1::Test::waiting(int i)
470 {
471 return;
472 }
473
474 // a class with some outside implementations which should all be grouped to
475 // this class declaration
476 class ClassWithExternals
477 {
478 private:
479 int i;
480
481 public:
482 ClassWithExternals();
483 ~ClassWithExternals();
484 void non_nil();
485 };
486
487
488 // Foobar is not displayed; seems that semantic tries to add this to the class
489 // Foobar but can not find/display it, because contained in the namespace above.
490 void
491 Foobar::non_nil()
492 {
493 return;
494 }
495
496 // are correctly grouped to the ClassWithExternals class
497 void
498 ClassWithExternals::non_nil()
499 {
500 String s = "lödfjg dlfgkdlfkgjdl";
501 return;
502 }
503
504 ClassWithExternals::ClassWithExternals()
505 {
506 return;
507 }
508
509 void
510 ClassWithExternals::~ClassWithExternals()
511 {
512 return;
513 }
514
515
516 // -------------------------------
517 // Now some macro and define stuff
518 // -------------------------------
519
520 #define TEST 0
521 #define TEST1 "String"
522
523 // The first backslash makes this macro unmatched syntax with semantic 1.4.2!
524 // With flexing \+newline as nothing all is working fine!
525 #define MZK_ENTER(METHOD) \
526 { \
527 CzkMethodLog lMethodLog(METHOD,"Framework");\
528 }
529
530 #define ZK_ASSERTM(METHOD,ASSERTION,MESSAGE) \
531 { if(!(ASSERTION))\
532 {\
533 std::ostringstream lMesgStream; \
534 lMesgStream << "Assertion failed: " \
535 << MESSAGE; \
536 CzkLogManager::doLog(CzkLogManager::FATAL,"",METHOD, \
537 "Assert",lMesgStream); \
538 assert(ASSERTION);\
539 }\
540 }
541
542 // Test if not newline-backslashes are handled correctly
543 string s = "My \"quoted\" string";
544
545 // parsed fine as macro
546 #define FOO (arg) method(arg, "foo");
547
548 // With semantic 1.4.2 this parsed as macro BAR *and* function method.
549 // With latest c.bnf at least one-liner macros can be parsed correctly.
550 #define BAR (arg) CzkMessageLog method(arg, "bar");
551
552 // some const and volatile stuff
553 char * p1 = "Hello"; // 1. variable Pointer, variable Data
554 const char * p2 = "Hello"; // 2. variable pointer, constant data
555 char * const p3 = "Hello"; // 3. constant pointer, variable data
556 const char * const p4 = "Hello"; // 4. constant pointer, constant data
557
558 // Case 2 and 4 can exchange first "const" and "char"
559 char const * p21 = "Hello"; // variable pointer, constant data
560 char const * const p41 = "Hello"; // constant pointer, constant data
561
562 char volatile a = 0; // a volatile char
563 void foo(bar const &arg); // a reference to a const bar
564 int foobar(bar const * const p); // a const pointer to a const bar
565 int foobar(bar const volatile * const p); // a const pointer to a const bar
566 int foobar3(char* p); // a const pointer to a const bar
567
568 // Should not be parsed because this is invalid code
569 int const & const r3 = i;
570
571 boolean i = 0;
572 boolean & r1 = i;
573 boolean const & r2 = i;
574
575 // const * sequences can be very long in C++ ;-)
576 char const * const * const * const * ppp;
577
578 // complex function declarationen with named pointer-arguments
579 const char** foobar1(volatile char const * const **p);
580 const char** foobar11(volatile Test::Namespace::Char<char*> const * const **p);
581
582 // complex function declarationen with unnamed pointer-arguments
583 const char* foobar2(const char***);
584 const char* foobar21(const Test::Namespace::Char<char>***);
585
586 // string literal parsing even with wchar_t
587 char const *p = "string1";
588 char const *q = "string1" "str\"ing2" "string3";
589 wchar_t testc = L'a';
590
591 wchar_t const *wp = L"string with a \" in it";
592 wchar_t const *wq = L"string \n\t\"test" L"string2";
593 wchar_t const *wr = L"string L";