/eclipse-cdt-8.1.0/org.eclipse.cdt-CDT_8_1_0/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/GCCTests.java

# · Java · 833 lines · 725 code · 92 blank · 16 comment · 0 complexity · 790483b85a9e88c05228e0b57e8e1de8 MD5 · raw file

Large files are truncated click here to view the full file

  1. /*******************************************************************************
  2. * Copyright (c) 2004, 2007 IBM Corporation and others.
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * http://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors:
  9. * IBM Corporation - initial API and implementation
  10. *******************************************************************************/
  11. /*
  12. * Created on Nov 22, 2004
  13. */
  14. package org.eclipse.cdt.core.parser.tests.ast2;
  15. import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
  16. import org.eclipse.cdt.core.dom.ast.ICompositeType;
  17. import org.eclipse.cdt.core.dom.ast.IEnumeration;
  18. import org.eclipse.cdt.core.dom.ast.IEnumerator;
  19. import org.eclipse.cdt.core.dom.ast.IField;
  20. import org.eclipse.cdt.core.dom.ast.IFunction;
  21. import org.eclipse.cdt.core.dom.ast.ILabel;
  22. import org.eclipse.cdt.core.dom.ast.IParameter;
  23. import org.eclipse.cdt.core.dom.ast.ITypedef;
  24. import org.eclipse.cdt.core.dom.ast.IVariable;
  25. import org.eclipse.cdt.core.parser.ParserLanguage;
  26. /**
  27. * @author aniefer
  28. */
  29. public class GCCTests extends AST2BaseTest {
  30. public GCCTests() {
  31. }
  32. public GCCTests(String name) {
  33. super(name);
  34. }
  35. public void testGCC20000113() throws Exception {
  36. StringBuilder buffer = new StringBuilder();
  37. buffer.append("struct x { \n"); //$NON-NLS-1$
  38. buffer.append(" unsigned x1:1; \n"); //$NON-NLS-1$
  39. buffer.append(" unsigned x2:2; \n"); //$NON-NLS-1$
  40. buffer.append(" unsigned x3:3; \n"); //$NON-NLS-1$
  41. buffer.append("}; \n"); //$NON-NLS-1$
  42. buffer.append("foobar(int x, int y, int z) { \n"); //$NON-NLS-1$
  43. buffer.append(" struct x a = {x, y, z}; \n"); //$NON-NLS-1$
  44. buffer.append(" struct x b = {x, y, z}; \n"); //$NON-NLS-1$
  45. buffer.append(" struct x *c = &b; \n"); //$NON-NLS-1$
  46. buffer.append(" c->x3 += (a.x2 - a.x1) * c->x2; \n"); //$NON-NLS-1$
  47. buffer.append(" if (a.x1 != 1 || c->x3 != 5) \n"); //$NON-NLS-1$
  48. buffer.append(" return -1; \n"); //$NON-NLS-1$
  49. buffer.append(" return 0; \n"); //$NON-NLS-1$
  50. buffer.append("} \n"); //$NON-NLS-1$
  51. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  52. CNameCollector collector = new CNameCollector();
  53. tu.accept(collector);
  54. assertEquals(collector.size(), 33);
  55. ICompositeType x = (ICompositeType) collector.getName(0).resolveBinding();
  56. IField x1 = (IField) collector.getName(1).resolveBinding();
  57. IField x2 = (IField) collector.getName(2).resolveBinding();
  58. IField x3 = (IField) collector.getName(3).resolveBinding();
  59. IVariable vx = (IVariable) collector.getName(5).resolveBinding();
  60. IVariable vy = (IVariable) collector.getName(6).resolveBinding();
  61. IVariable vz = (IVariable) collector.getName(7).resolveBinding();
  62. IVariable a = (IVariable) collector.getName(9).resolveBinding();
  63. IVariable b = (IVariable) collector.getName(14).resolveBinding();
  64. IVariable c = (IVariable) collector.getName(19).resolveBinding();
  65. assertInstances(collector, x, 4);
  66. assertInstances(collector, x1, 3);
  67. assertInstances(collector, x2, 3);
  68. assertInstances(collector, x3, 3);
  69. assertInstances(collector, vx, 3);
  70. assertInstances(collector, vy, 3);
  71. assertInstances(collector, vz, 3);
  72. assertInstances(collector, a, 4);
  73. assertInstances(collector, b, 2);
  74. assertInstances(collector, c, 4);
  75. }
  76. public void testGCC20000205() throws Exception{
  77. StringBuilder buffer = new StringBuilder();
  78. buffer.append("static int f(int a) { \n"); //$NON-NLS-1$
  79. buffer.append(" if (a == 0) \n"); //$NON-NLS-1$
  80. buffer.append(" return 0; \n"); //$NON-NLS-1$
  81. buffer.append(" do \n"); //$NON-NLS-1$
  82. buffer.append(" if (a & 128) \n"); //$NON-NLS-1$
  83. buffer.append(" return 1; \n"); //$NON-NLS-1$
  84. buffer.append(" while (f(0)); \n"); //$NON-NLS-1$
  85. buffer.append(" return 0; \n"); //$NON-NLS-1$
  86. buffer.append("} \n"); //$NON-NLS-1$
  87. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  88. CNameCollector collector = new CNameCollector();
  89. tu.accept(collector);
  90. assertEquals(collector.size(), 5);
  91. IFunction f = (IFunction) collector.getName(0).resolveBinding();
  92. IVariable a = (IVariable) collector.getName(1).resolveBinding();
  93. assertInstances(collector, f, 2);
  94. assertInstances(collector, a, 3);
  95. }
  96. public void testGCC20000217() throws Exception{
  97. StringBuilder buffer = new StringBuilder();
  98. buffer.append("unsigned short int showbug(unsigned short int * a, \n"); //$NON-NLS-1$
  99. buffer.append(" unsigned short int * b) { \n"); //$NON-NLS-1$
  100. buffer.append(" *a += *b - 8; \n"); //$NON-NLS-1$
  101. buffer.append(" return (*a >= 8); \n"); //$NON-NLS-1$
  102. buffer.append("} \n"); //$NON-NLS-1$
  103. buffer.append("int main() { \n"); //$NON-NLS-1$
  104. buffer.append(" unsigned short int x = 0; \n"); //$NON-NLS-1$
  105. buffer.append(" unsigned short int y = 10; \n"); //$NON-NLS-1$
  106. buffer.append(" if (showbug(&x, &y) != 0) \n"); //$NON-NLS-1$
  107. buffer.append(" return -1; \n"); //$NON-NLS-1$
  108. buffer.append(" return 0; \n"); //$NON-NLS-1$
  109. buffer.append("} \n"); //$NON-NLS-1$
  110. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  111. CNameCollector collector = new CNameCollector();
  112. tu.accept(collector);
  113. assertEquals(collector.size(), 12);
  114. IFunction showBug = (IFunction) collector.getName(0).resolveBinding();
  115. IVariable a = (IVariable) collector.getName(1).resolveBinding();
  116. IVariable b = (IVariable) collector.getName(2).resolveBinding();
  117. IVariable x = (IVariable) collector.getName(7).resolveBinding();
  118. IVariable y = (IVariable) collector.getName(8).resolveBinding();
  119. assertInstances(collector, showBug, 2);
  120. assertInstances(collector, a, 3);
  121. assertInstances(collector, b, 2);
  122. assertInstances(collector, x, 2);
  123. assertInstances(collector, y, 2);
  124. }
  125. public void testGCC20000224() throws Exception{
  126. StringBuilder buffer = new StringBuilder();
  127. buffer.append("int loop_1 = 100; \n"); //$NON-NLS-1$
  128. buffer.append("int loop_2 = 7; \n"); //$NON-NLS-1$
  129. buffer.append("int flag = 0; \n"); //$NON-NLS-1$
  130. buffer.append("int test(void) { \n"); //$NON-NLS-1$
  131. buffer.append(" int i; \n"); //$NON-NLS-1$
  132. buffer.append(" int counter = 0; \n"); //$NON-NLS-1$
  133. buffer.append(" while (loop_1 > counter) { \n"); //$NON-NLS-1$
  134. buffer.append(" if (flag & 1) { \n"); //$NON-NLS-1$
  135. buffer.append(" for (i = 0; i < loop_2; i++) { \n"); //$NON-NLS-1$
  136. buffer.append(" counter++; \n"); //$NON-NLS-1$
  137. buffer.append(" } \n"); //$NON-NLS-1$
  138. buffer.append(" } \n"); //$NON-NLS-1$
  139. buffer.append(" flag++; \n"); //$NON-NLS-1$
  140. buffer.append(" } \n"); //$NON-NLS-1$
  141. buffer.append(" return 1; \n"); //$NON-NLS-1$
  142. buffer.append("} \n"); //$NON-NLS-1$
  143. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  144. CNameCollector collector = new CNameCollector();
  145. tu.accept(collector);
  146. assertEquals(collector.size(), 16);
  147. IVariable loop1 = (IVariable) collector.getName(0).resolveBinding();
  148. IVariable loop2 = (IVariable) collector.getName(1).resolveBinding();
  149. IVariable flag = (IVariable) collector.getName(2).resolveBinding();
  150. IVariable i = (IVariable) collector.getName(5).resolveBinding();
  151. IVariable counter = (IVariable) collector.getName(6).resolveBinding();
  152. assertInstances(collector, loop1, 2);
  153. assertInstances(collector, loop2, 2);
  154. assertInstances(collector, flag, 3);
  155. assertInstances(collector, i, 4);
  156. assertInstances(collector, counter, 3);
  157. }
  158. public void testGCC20000225() throws Exception {
  159. StringBuilder buffer = new StringBuilder();
  160. buffer.append("int main() { \n"); //$NON-NLS-1$
  161. buffer.append(" int nResult, b = 0, i = -1; \n"); //$NON-NLS-1$
  162. buffer.append(" do { \n"); //$NON-NLS-1$
  163. buffer.append(" if (b != 0) { \n"); //$NON-NLS-1$
  164. buffer.append(" nResult = 1; \n"); //$NON-NLS-1$
  165. buffer.append(" } else { \n"); //$NON-NLS-1$
  166. buffer.append(" nResult = 0; \n"); //$NON-NLS-1$
  167. buffer.append(" } \n"); //$NON-NLS-1$
  168. buffer.append(" i++; \n"); //$NON-NLS-1$
  169. buffer.append(" b = (i + 2) * 4; \n"); //$NON-NLS-1$
  170. buffer.append(" } while (i < 0); \n"); //$NON-NLS-1$
  171. buffer.append(" return -1; \n"); //$NON-NLS-1$
  172. buffer.append("} \n"); //$NON-NLS-1$
  173. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  174. CNameCollector collector = new CNameCollector();
  175. tu.accept(collector);
  176. assertEquals(collector.size(), 11);
  177. IVariable nResult = (IVariable) collector.getName(1).resolveBinding();
  178. IVariable b = (IVariable) collector.getName(2).resolveBinding();
  179. IVariable i = (IVariable) collector.getName(3).resolveBinding();
  180. assertInstances(collector, nResult, 3);
  181. assertInstances(collector, b, 3);
  182. assertInstances(collector, i, 4);
  183. }
  184. public void testGCC20000227() throws Exception {
  185. StringBuilder buffer = new StringBuilder();
  186. buffer.append("static const unsigned char f[] = \"\\0\\377\"; \n"); //$NON-NLS-1$
  187. buffer.append("static const unsigned char g[] = \"\\0y\"; \n"); //$NON-NLS-1$
  188. buffer.append("int main() { \n"); //$NON-NLS-1$
  189. buffer.append(" if (sizeof f != 3 || sizeof g != 3) \n"); //$NON-NLS-1$
  190. buffer.append(" return -1; \n"); //$NON-NLS-1$
  191. buffer.append(" if (f[0] != g[0]) \n"); //$NON-NLS-1$
  192. buffer.append(" return -1; \n"); //$NON-NLS-1$
  193. buffer.append(" if (f[1] != g[1] || f[2] != g[2]) \n"); //$NON-NLS-1$
  194. buffer.append(" return -1; \n"); //$NON-NLS-1$
  195. buffer.append(" return 0; \n"); //$NON-NLS-1$
  196. buffer.append("} \n"); //$NON-NLS-1$
  197. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  198. CNameCollector collector = new CNameCollector();
  199. tu.accept(collector);
  200. assertEquals(collector.size(), 11);
  201. IVariable f = (IVariable) collector.getName(0).resolveBinding();
  202. IVariable g = (IVariable) collector.getName(1).resolveBinding();
  203. assertInstances(collector, f, 5);
  204. assertInstances(collector, g, 5);
  205. }
  206. public void testGCC20000313() throws Exception{
  207. StringBuilder buffer = new StringBuilder();
  208. buffer.append("unsigned int buggy(unsigned int *param) { \n"); //$NON-NLS-1$
  209. buffer.append(" unsigned int accu, zero = 0, borrow; \n"); //$NON-NLS-1$
  210. buffer.append(" accu = - *param; \n"); //$NON-NLS-1$
  211. buffer.append(" borrow = - (accu > zero); \n"); //$NON-NLS-1$
  212. buffer.append(" return borrow; \n"); //$NON-NLS-1$
  213. buffer.append("} \n"); //$NON-NLS-1$
  214. buffer.append("int main(void) { \n"); //$NON-NLS-1$
  215. buffer.append(" unsigned int param = 1; \n"); //$NON-NLS-1$
  216. buffer.append(" unsigned int borrow = buggy (&param); \n"); //$NON-NLS-1$
  217. buffer.append(" if (param != 0) \n"); //$NON-NLS-1$
  218. buffer.append(" return -1; \n"); //$NON-NLS-1$
  219. buffer.append(" if (borrow +1 != 0) \n"); //$NON-NLS-1$
  220. buffer.append(" return -1; \n"); //$NON-NLS-1$
  221. buffer.append(" return 0; \n"); //$NON-NLS-1$
  222. buffer.append("} \n"); //$NON-NLS-1$
  223. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  224. CNameCollector collector = new CNameCollector();
  225. tu.accept(collector);
  226. assertEquals(collector.size(), 19);
  227. IFunction buggy = (IFunction) collector.getName(0).resolveBinding();
  228. IParameter param = (IParameter) collector.getName(1).resolveBinding();
  229. IVariable accu = (IVariable) collector.getName(2).resolveBinding();
  230. IVariable zero = (IVariable) collector.getName(3).resolveBinding();
  231. IVariable borrow = (IVariable) collector.getName(4).resolveBinding();
  232. IVariable param2 = (IVariable) collector.getName(13).resolveBinding();
  233. IVariable borrow2 = (IVariable) collector.getName(14).resolveBinding();
  234. assertInstances(collector, buggy, 2);
  235. assertInstances(collector, param, 2);
  236. assertInstances(collector, accu, 3);
  237. assertInstances(collector, zero, 2);
  238. assertInstances(collector, borrow, 3);
  239. assertInstances(collector, param2, 3);
  240. assertInstances(collector, borrow2, 2);
  241. }
  242. public void testGCC20000314_1() throws Exception{
  243. StringBuilder buffer = new StringBuilder();
  244. buffer.append("int main() { \n"); //$NON-NLS-1$
  245. buffer.append(" long winds = 0; \n"); //$NON-NLS-1$
  246. buffer.append(" while (winds != 0) { \n"); //$NON-NLS-1$
  247. buffer.append(" if (*(char*)winds) \n"); //$NON-NLS-1$
  248. buffer.append(" break; \n"); //$NON-NLS-1$
  249. buffer.append(" } \n"); //$NON-NLS-1$
  250. buffer.append(" if (winds == 0 || winds != 0 || *(char*) winds) \n"); //$NON-NLS-1$
  251. buffer.append(" return 0; \n"); //$NON-NLS-1$
  252. buffer.append(" return -1; \n"); //$NON-NLS-1$
  253. buffer.append("} \n"); //$NON-NLS-1$
  254. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  255. CNameCollector collector = new CNameCollector();
  256. tu.accept(collector);
  257. assertEquals(collector.size(), 7);
  258. IVariable winds = (IVariable) collector.getName(1).resolveBinding();
  259. assertInstances(collector, winds, 6);
  260. }
  261. public void testGCC20000314_2() throws Exception{
  262. StringBuilder buffer = new StringBuilder();
  263. buffer.append("typedef unsigned long long uint64; \n"); //$NON-NLS-1$
  264. buffer.append("const uint64 bigconst = 1ULL << 34; \n"); //$NON-NLS-1$
  265. buffer.append("int a = 1; \n"); //$NON-NLS-1$
  266. buffer.append("static uint64 getmask(void) { \n"); //$NON-NLS-1$
  267. buffer.append(" if (a) return bigconst; \n"); //$NON-NLS-1$
  268. buffer.append(" else return 0; \n"); //$NON-NLS-1$
  269. buffer.append("} \n"); //$NON-NLS-1$
  270. buffer.append("main() { \n"); //$NON-NLS-1$
  271. buffer.append(" uint64 f = getmask(); \n"); //$NON-NLS-1$
  272. buffer.append(" if (sizeof (long long) == 8 && f != bigconst) \n"); //$NON-NLS-1$
  273. buffer.append(" return -1; \n"); //$NON-NLS-1$
  274. buffer.append(" return 0; \n"); //$NON-NLS-1$
  275. buffer.append("} \n"); //$NON-NLS-1$
  276. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  277. CNameCollector collector = new CNameCollector();
  278. tu.accept(collector);
  279. assertEquals(collector.size(), 15);
  280. ITypedef uint64 = (ITypedef) collector.getName(0).resolveBinding();
  281. IVariable bigconst = (IVariable) collector.getName(2).resolveBinding();
  282. IVariable a = (IVariable) collector.getName(3).resolveBinding();
  283. IFunction getmask = (IFunction) collector.getName(5).resolveBinding();
  284. IVariable f = (IVariable) collector.getName(11).resolveBinding();
  285. assertInstances(collector, uint64, 4);
  286. assertInstances(collector, bigconst, 3);
  287. assertInstances(collector, a, 2);
  288. assertInstances(collector, getmask, 2);
  289. assertInstances(collector, f, 2);
  290. }
  291. public void testGCC20000403() throws Exception {
  292. StringBuilder buffer = new StringBuilder();
  293. buffer.append("extern unsigned long aa[], bb[]; \n"); //$NON-NLS-1$
  294. buffer.append("int seqgt(unsigned long a, unsigned short win, unsigned long b); \n"); //$NON-NLS-1$
  295. buffer.append("int seqgt2 (unsigned long a, unsigned short win, unsigned long b); \n"); //$NON-NLS-1$
  296. buffer.append("main() { \n"); //$NON-NLS-1$
  297. buffer.append(" if (!seqgt(*aa, 0x1000, *bb) || !seqgt2(*aa, 0x1000, *bb)) \n"); //$NON-NLS-1$
  298. buffer.append(" return -1; \n"); //$NON-NLS-1$
  299. buffer.append(" return 0; \n"); //$NON-NLS-1$
  300. buffer.append("} \n"); //$NON-NLS-1$
  301. buffer.append("int seqgt(unsigned long a, unsigned short win, unsigned long b) { \n"); //$NON-NLS-1$
  302. buffer.append(" return (long) ((a + win) - b) > 0; \n"); //$NON-NLS-1$
  303. buffer.append("} \n"); //$NON-NLS-1$
  304. buffer.append("int seqgt2(unsigned long a, unsigned short win, unsigned long b) { \n"); //$NON-NLS-1$
  305. buffer.append(" long l = ((a + win) - b); \n"); //$NON-NLS-1$
  306. buffer.append(" return 1 > 0; \n"); //$NON-NLS-1$
  307. buffer.append("} \n"); //$NON-NLS-1$
  308. buffer.append("unsigned long aa[] = { (1UL << (sizeof(long) *8 - 1)) = 0xfff }; \n"); //$NON-NLS-1$
  309. buffer.append("unsigned long bb[] = { (1UL << (sizeof(long) *8 - 1)) = 0xfff }; \n"); //$NON-NLS-1$
  310. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  311. CNameCollector collector = new CNameCollector();
  312. tu.accept(collector);
  313. assertEquals(collector.size(), 34);
  314. IVariable aa = (IVariable) collector.getName(0).resolveBinding();
  315. IVariable bb = (IVariable) collector.getName(1).resolveBinding();
  316. IFunction seqgt = (IFunction) collector.getName(2).resolveBinding();
  317. IParameter a1 = (IParameter) collector.getName(3).resolveBinding();
  318. IParameter win1 = (IParameter) collector.getName(4).resolveBinding();
  319. IParameter b1 = (IParameter) collector.getName(5).resolveBinding();
  320. IFunction seqgt2 = (IFunction) collector.getName(6).resolveBinding();
  321. IParameter a2 = (IParameter) collector.getName(7).resolveBinding();
  322. IParameter win2 = (IParameter) collector.getName(8).resolveBinding();
  323. IParameter b2 = (IParameter) collector.getName(9).resolveBinding();
  324. assertInstances(collector, aa, 4);
  325. assertInstances(collector, bb, 4);
  326. assertInstances(collector, seqgt, 3);
  327. assertInstances(collector, a1, 3);
  328. assertInstances(collector, win1, 3);
  329. assertInstances(collector, b1, 3);
  330. assertInstances(collector, seqgt2, 3);
  331. assertInstances(collector, a2, 3);
  332. assertInstances(collector, win2, 3);
  333. assertInstances(collector, b2, 3);
  334. }
  335. public void testGCC20000412_1 () throws Exception {
  336. StringBuilder buffer = new StringBuilder();
  337. buffer.append("short int i = -1; \n"); //$NON-NLS-1$
  338. buffer.append("const char * const wordlist[207]; \n"); //$NON-NLS-1$
  339. buffer.append("const char * const * foo(void) { \n"); //$NON-NLS-1$
  340. buffer.append(" register const char * const *wordptr = &wordlist[207u + i]; \n"); //$NON-NLS-1$
  341. buffer.append(" return wordptr; \n"); //$NON-NLS-1$
  342. buffer.append("} \n"); //$NON-NLS-1$
  343. buffer.append("int main() { \n"); //$NON-NLS-1$
  344. buffer.append(" if (foo() != &wordlist[206]) \n"); //$NON-NLS-1$
  345. buffer.append(" return -1; \n"); //$NON-NLS-1$
  346. buffer.append(" return 0; \n"); //$NON-NLS-1$
  347. buffer.append("} \n"); //$NON-NLS-1$
  348. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  349. CNameCollector collector = new CNameCollector();
  350. tu.accept(collector);
  351. assertEquals(collector.size(), 11);
  352. IVariable i = (IVariable) collector.getName(0).resolveBinding();
  353. IVariable wordlist = (IVariable) collector.getName(1).resolveBinding();
  354. IFunction foo = (IFunction) collector.getName(2).resolveBinding();
  355. IVariable wordptr = (IVariable) collector.getName(4).resolveBinding();
  356. assertInstances(collector, i, 2);
  357. assertInstances(collector, wordlist, 3);
  358. assertInstances(collector, foo, 2);
  359. assertInstances(collector, wordptr, 2);
  360. }
  361. public void testGCC20000412_2() throws Exception {
  362. StringBuilder buffer = new StringBuilder();
  363. buffer.append("int f(int a, int *y) { \n"); //$NON-NLS-1$
  364. buffer.append(" int x = a; \n"); //$NON-NLS-1$
  365. buffer.append(" if (a == 0) return *y; \n"); //$NON-NLS-1$
  366. buffer.append(" return f(a-1, &x); \n"); //$NON-NLS-1$
  367. buffer.append("} \n"); //$NON-NLS-1$
  368. buffer.append("int main(int argc, char** argv) { \n"); //$NON-NLS-1$
  369. buffer.append(" if (f(100, (int *) 0) != 1) \n"); //$NON-NLS-1$
  370. buffer.append(" return -1; \n"); //$NON-NLS-1$
  371. buffer.append(" return 0; \n"); //$NON-NLS-1$
  372. buffer.append("} \n"); //$NON-NLS-1$
  373. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  374. CNameCollector collector = new CNameCollector();
  375. tu.accept(collector);
  376. assertEquals(collector.size(), 14);
  377. IFunction f = (IFunction) collector.getName(0).resolveBinding();
  378. IParameter a = (IParameter) collector.getName(1).resolveBinding();
  379. IParameter y = (IParameter) collector.getName(2).resolveBinding();
  380. IVariable x = (IVariable) collector.getName(3).resolveBinding();
  381. assertInstances(collector, f, 3);
  382. assertInstances(collector, a, 4);
  383. assertInstances(collector, y, 2);
  384. assertInstances(collector, x, 2);
  385. }
  386. public void testGCC20000412_3() throws Exception{
  387. StringBuilder buffer = new StringBuilder();
  388. buffer.append("typedef struct { \n"); //$NON-NLS-1$
  389. buffer.append(" char y; \n"); //$NON-NLS-1$
  390. buffer.append(" char x[32]; \n"); //$NON-NLS-1$
  391. buffer.append("} X; \n"); //$NON-NLS-1$
  392. buffer.append("int z(void) { \n"); //$NON-NLS-1$
  393. buffer.append(" X xxx; \n"); //$NON-NLS-1$
  394. buffer.append(" xxx.x[0] = xxx.x[31] = '0'; \n"); //$NON-NLS-1$
  395. buffer.append(" xxx.y = 0xf; \n"); //$NON-NLS-1$
  396. buffer.append(" return f(xxx, xxx); \n"); //$NON-NLS-1$
  397. buffer.append("} \n"); //$NON-NLS-1$
  398. buffer.append("int main (void) { \n"); //$NON-NLS-1$
  399. buffer.append(" int val; \n"); //$NON-NLS-1$
  400. buffer.append(" val = z(); \n"); //$NON-NLS-1$
  401. buffer.append(" if (val != 0x60) return -1; \n"); //$NON-NLS-1$
  402. buffer.append(" return 0; \n"); //$NON-NLS-1$
  403. buffer.append("} \n"); //$NON-NLS-1$
  404. buffer.append("int f(X x, X y) { \n"); //$NON-NLS-1$
  405. buffer.append(" if (x.y != y.y) \n"); //$NON-NLS-1$
  406. buffer.append(" return 'F'; \n"); //$NON-NLS-1$
  407. buffer.append(" return x.x[0] + y.x[0]; \n"); //$NON-NLS-1$
  408. buffer.append("} \n"); //$NON-NLS-1$
  409. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  410. CNameCollector collector = new CNameCollector();
  411. tu.accept(collector);
  412. assertEquals(collector.size(), 36);
  413. IField y = (IField) collector.getName(1).resolveBinding();
  414. IField x = (IField) collector.getName(2).resolveBinding();
  415. ITypedef X = (ITypedef) collector.getName(3).resolveBinding();
  416. IFunction z = (IFunction) collector.getName(4).resolveBinding();
  417. IVariable xxx = (IVariable) collector.getName(7).resolveBinding();
  418. IVariable val = (IVariable) collector.getName(19).resolveBinding();
  419. IParameter px = (IParameter) collector.getName(25).resolveBinding();
  420. IParameter py = (IParameter) collector.getName(27).resolveBinding();
  421. assertInstances(collector, y, 4);
  422. assertInstances(collector, x, 5);
  423. assertInstances(collector, X, 4);
  424. assertInstances(collector, z, 2);
  425. assertInstances(collector, xxx, 6);
  426. assertInstances(collector, val, 3);
  427. assertInstances(collector, px, 3);
  428. assertInstances(collector, py, 3);
  429. }
  430. public void testGCC20000412_4() throws Exception{
  431. StringBuilder buffer = new StringBuilder();
  432. buffer.append("void f(int i, int j, int radius, int width, int N) { \n"); //$NON-NLS-1$
  433. buffer.append(" const int diff = i - radius; \n"); //$NON-NLS-1$
  434. buffer.append(" const int lowk = (diff > 0 ? diff : 0); \n"); //$NON-NLS-1$
  435. buffer.append(" int k; \n"); //$NON-NLS-1$
  436. buffer.append(" for (k = lowk; k <= 2; k++) { \n"); //$NON-NLS-1$
  437. buffer.append(" int idx = ((k-i+radius) * width - j + radius); \n"); //$NON-NLS-1$
  438. buffer.append(" if (idx < 0) return -1; \n"); //$NON-NLS-1$
  439. buffer.append(" } \n"); //$NON-NLS-1$
  440. buffer.append(" for (k = lowk; k <= 2; k++) ; \n"); //$NON-NLS-1$
  441. buffer.append("} \n"); //$NON-NLS-1$
  442. buffer.append("int main (int argc, char** argv) { \n"); //$NON-NLS-1$
  443. buffer.append(" int exc_rad = 2; \n"); //$NON-NLS-1$
  444. buffer.append(" int N = 8; \n"); //$NON-NLS-1$
  445. buffer.append(" int i; \n"); //$NON-NLS-1$
  446. buffer.append(" for (i = 1; i < 4; i++) \n"); //$NON-NLS-1$
  447. buffer.append(" f(i, 1, exc_rad, 2*exc_rad + 1, N); \n"); //$NON-NLS-1$
  448. buffer.append(" return 0; \n"); //$NON-NLS-1$
  449. buffer.append("} \n"); //$NON-NLS-1$
  450. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  451. CNameCollector collector = new CNameCollector();
  452. tu.accept(collector);
  453. assertEquals(collector.size(), 43);
  454. IFunction f = (IFunction) collector.getName(0).resolveBinding();
  455. IParameter i1 = (IParameter) collector.getName(1).resolveBinding();
  456. IParameter j = (IParameter) collector.getName(2).resolveBinding();
  457. IParameter radius = (IParameter) collector.getName(3).resolveBinding();
  458. IParameter width = (IParameter) collector.getName(4).resolveBinding();
  459. IParameter N1 = (IParameter) collector.getName(5).resolveBinding();
  460. IVariable diff = (IVariable) collector.getName(6).resolveBinding();
  461. IVariable lowk = (IVariable) collector.getName(9).resolveBinding();
  462. IVariable k = (IVariable) collector.getName(12).resolveBinding();
  463. IVariable idx = (IVariable) collector.getName(17).resolveBinding();
  464. IVariable exc_rad = (IVariable) collector.getName(32).resolveBinding();
  465. IVariable N2 = (IVariable) collector.getName(33).resolveBinding();
  466. IVariable i2 = (IVariable) collector.getName(34).resolveBinding();
  467. assertInstances(collector, f, 2);
  468. assertInstances(collector, i1, 3);
  469. assertInstances(collector, j, 2);
  470. assertInstances(collector, radius, 4);
  471. assertInstances(collector, width, 2);
  472. assertInstances(collector, N1, 1);
  473. assertInstances(collector, diff, 3);
  474. assertInstances(collector, lowk, 3);
  475. assertInstances(collector, k, 8);
  476. assertInstances(collector, idx, 2);
  477. assertInstances(collector, exc_rad, 3);
  478. assertInstances(collector, N2, 2);
  479. assertInstances(collector, i2, 5);
  480. }
  481. public void testGCC20000412_5() throws Exception {
  482. StringBuilder buffer = new StringBuilder();
  483. buffer.append("int main(void) { \n"); //$NON-NLS-1$
  484. buffer.append(" struct { \n"); //$NON-NLS-1$
  485. buffer.append(" int node; \n"); //$NON-NLS-1$
  486. buffer.append(" int type; \n"); //$NON-NLS-1$
  487. buffer.append(" } lastglob[1] = { { 0, 1 } }; \n"); //$NON-NLS-1$
  488. buffer.append(" if (lastglob[0].node != 0 || lastglob[0].type != 1) \n"); //$NON-NLS-1$
  489. buffer.append(" return -1; \n"); //$NON-NLS-1$
  490. buffer.append(" return 0; \n"); //$NON-NLS-1$
  491. buffer.append("} \n"); //$NON-NLS-1$
  492. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  493. CNameCollector collector = new CNameCollector();
  494. tu.accept(collector);
  495. assertEquals(collector.size(), 10);
  496. IField node = (IField) collector.getName(3).resolveBinding();
  497. IField type = (IField) collector.getName(4).resolveBinding();
  498. IVariable lastglob = (IVariable) collector.getName(5).resolveBinding();
  499. assertInstances(collector, node, 2);
  500. assertInstances(collector, type, 2);
  501. assertInstances(collector, lastglob, 3);
  502. }
  503. public void testGCC20000419() throws Exception {
  504. StringBuilder buffer = new StringBuilder();
  505. buffer.append("struct foo { int a, b, c; }; \n"); //$NON-NLS-1$
  506. buffer.append("void brother(int a, int b, int c) { \n"); //$NON-NLS-1$
  507. buffer.append(" if (a) return; \n"); //$NON-NLS-1$
  508. buffer.append("} \n"); //$NON-NLS-1$
  509. buffer.append("void sister(struct foo f, int b, int c) { \n"); //$NON-NLS-1$
  510. buffer.append(" brother((f.b == b), b, c); \n"); //$NON-NLS-1$
  511. buffer.append("} \n"); //$NON-NLS-1$
  512. buffer.append("int main() { \n"); //$NON-NLS-1$
  513. buffer.append(" struct foo f = { 7, 8, 9 }; \n"); //$NON-NLS-1$
  514. buffer.append(" sister(f, 1, 2); \n"); //$NON-NLS-1$
  515. buffer.append(" return 0; \n"); //$NON-NLS-1$
  516. buffer.append("} \n"); //$NON-NLS-1$
  517. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  518. CNameCollector collector = new CNameCollector();
  519. tu.accept(collector);
  520. assertEquals(collector.size(), 25);
  521. ICompositeType foo = (ICompositeType) collector.getName(0).resolveBinding();
  522. IField fa = (IField) collector.getName(1).resolveBinding();
  523. IField fb = (IField) collector.getName(2).resolveBinding();
  524. IField fc = (IField) collector.getName(3).resolveBinding();
  525. IFunction brother = (IFunction) collector.getName(4).resolveBinding();
  526. IParameter pa = (IParameter) collector.getName(5).resolveBinding();
  527. IParameter pb = (IParameter) collector.getName(6).resolveBinding();
  528. IParameter pc = (IParameter) collector.getName(7).resolveBinding();
  529. IFunction sister = (IFunction) collector.getName(9).resolveBinding();
  530. IParameter sf = (IParameter) collector.getName(11).resolveBinding();
  531. IParameter sb = (IParameter) collector.getName(12).resolveBinding();
  532. IParameter sc = (IParameter) collector.getName(13).resolveBinding();
  533. IVariable f = (IVariable) collector.getName(22).resolveBinding();
  534. assertInstances(collector, foo, 3);
  535. assertInstances(collector, fa, 1);
  536. assertInstances(collector, fb, 2);
  537. assertInstances(collector, fc, 1);
  538. assertInstances(collector, brother, 2);
  539. assertInstances(collector, pa, 2);
  540. assertInstances(collector, pb, 1);
  541. assertInstances(collector, pc, 1);
  542. assertInstances(collector, sister, 2);
  543. assertInstances(collector, sf, 2);
  544. assertInstances(collector, sb, 3);
  545. assertInstances(collector, sc, 2);
  546. assertInstances(collector, f, 2);
  547. }
  548. public void testGCC20000503() throws Exception {
  549. StringBuilder buffer = new StringBuilder();
  550. buffer.append("unsigned long sub(int a) { \n"); //$NON-NLS-1$
  551. buffer.append(" return ((0 > a - 2) ? 0 : a - 2) * sizeof(long); \n"); //$NON-NLS-1$
  552. buffer.append("} \n"); //$NON-NLS-1$
  553. buffer.append("main() { \n"); //$NON-NLS-1$
  554. buffer.append(" return (sub(0) != 0); \n"); //$NON-NLS-1$
  555. buffer.append("} \n"); //$NON-NLS-1$
  556. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  557. CNameCollector collector = new CNameCollector();
  558. tu.accept(collector);
  559. assertEquals(collector.size(), 6);
  560. IFunction sub = (IFunction) collector.getName(0).resolveBinding();
  561. IParameter a = (IParameter) collector.getName(1).resolveBinding();
  562. assertInstances(collector, sub, 2);
  563. assertInstances(collector, a, 3);
  564. }
  565. public void testGCC20000511() throws Exception {
  566. StringBuilder buffer = new StringBuilder();
  567. buffer.append("int f(int value, int expect) { \n"); //$NON-NLS-1$
  568. buffer.append(" return (value == expect); \n"); //$NON-NLS-1$
  569. buffer.append("} \n"); //$NON-NLS-1$
  570. buffer.append("main() { \n"); //$NON-NLS-1$
  571. buffer.append(" int a = 7, b = 6, c = 4, d = 7, e = 2; \n"); //$NON-NLS-1$
  572. buffer.append(" f(a || b % c, 1); \n"); //$NON-NLS-1$
  573. buffer.append(" f(a ? b % c : 0, 2); \n"); //$NON-NLS-1$
  574. buffer.append(" f(a = b % c, 2); \n"); //$NON-NLS-1$
  575. buffer.append(" f(a *= b % c, 4); \n"); //$NON-NLS-1$
  576. buffer.append(" f(a /= b % c, 2); \n"); //$NON-NLS-1$
  577. buffer.append(" f(a %= b % c, 0); \n"); //$NON-NLS-1$
  578. buffer.append(" f(a += b % c, 2); \n"); //$NON-NLS-1$
  579. buffer.append(" f(d || c && e, 1); \n"); //$NON-NLS-1$
  580. buffer.append(" f(d ? c && e : 0, 1); \n"); //$NON-NLS-1$
  581. buffer.append(" f(d = c && e, 1); \n"); //$NON-NLS-1$
  582. buffer.append(" f(d *= c && e, 1); \n"); //$NON-NLS-1$
  583. buffer.append(" f(d %= c && e, 0); \n"); //$NON-NLS-1$
  584. buffer.append(" f(d += c && e, 1); \n"); //$NON-NLS-1$
  585. buffer.append(" f(d -= c && e, 0); \n"); //$NON-NLS-1$
  586. buffer.append(" f(d || c || e, 1); \n"); //$NON-NLS-1$
  587. buffer.append(" f(d ? c || e : 0, 0); \n"); //$NON-NLS-1$
  588. buffer.append(" f(d = c || e, 1); \n"); //$NON-NLS-1$
  589. buffer.append(" f(d *= c || e, 1); \n"); //$NON-NLS-1$
  590. buffer.append(" f(d %= c || e, 0); \n"); //$NON-NLS-1$
  591. buffer.append(" f(d += c || e, 1); \n"); //$NON-NLS-1$
  592. buffer.append(" f(d -= c || e, 0); \n"); //$NON-NLS-1$
  593. buffer.append("} \n"); //$NON-NLS-1$
  594. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  595. CNameCollector collector = new CNameCollector();
  596. tu.accept(collector);
  597. assertEquals(collector.size(), 95);
  598. IFunction f = (IFunction) collector.getName(0).resolveBinding();
  599. IParameter v = (IParameter) collector.getName(1).resolveBinding();
  600. IParameter ex = (IParameter) collector.getName(2).resolveBinding();
  601. IVariable a = (IVariable) collector.getName(6).resolveBinding();
  602. IVariable b = (IVariable) collector.getName(7).resolveBinding();
  603. IVariable c = (IVariable) collector.getName(8).resolveBinding();
  604. IVariable d = (IVariable) collector.getName(9).resolveBinding();
  605. IVariable e = (IVariable) collector.getName(10).resolveBinding();
  606. assertInstances(collector, f, 22);
  607. assertInstances(collector, v, 2);
  608. assertInstances(collector, ex, 2);
  609. assertInstances(collector, a, 8);
  610. assertInstances(collector, b, 8);
  611. assertInstances(collector, c, 22);
  612. assertInstances(collector, d, 15);
  613. assertInstances(collector, e, 15);
  614. }
  615. public void testGCC20000603() throws Exception {
  616. StringBuilder buffer = new StringBuilder();
  617. buffer.append("struct s1 { double d; }; \n"); //$NON-NLS-1$
  618. buffer.append("struct s2 { double d; }; \n"); //$NON-NLS-1$
  619. buffer.append("double f(struct s1 * a, struct s2 *b) { \n"); //$NON-NLS-1$
  620. buffer.append(" a->d = 1.0; \n"); //$NON-NLS-1$
  621. buffer.append(" return b->d + 1.0; \n"); //$NON-NLS-1$
  622. buffer.append("} \n"); //$NON-NLS-1$
  623. buffer.append("int main() { \n"); //$NON-NLS-1$
  624. buffer.append(" struct s1 a; \n"); //$NON-NLS-1$
  625. buffer.append(" a.d = 0.0; \n"); //$NON-NLS-1$
  626. buffer.append(" if (f(&a, (struct s2 *)&a) != 2.0) \n"); //$NON-NLS-1$
  627. buffer.append(" return -1; \n"); //$NON-NLS-1$
  628. buffer.append(" return 0; \n"); //$NON-NLS-1$
  629. buffer.append("} \n"); //$NON-NLS-1$
  630. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  631. CNameCollector collector = new CNameCollector();
  632. tu.accept(collector);
  633. assertEquals(collector.size(), 22);
  634. ICompositeType s1 = (ICompositeType) collector.getName(0).resolveBinding();
  635. IField d1 = (IField) collector.getName(1).resolveBinding();
  636. ICompositeType s2 = (ICompositeType) collector.getName(2).resolveBinding();
  637. IField d2 = (IField) collector.getName(3).resolveBinding();
  638. IFunction f = (IFunction) collector.getName(4).resolveBinding();
  639. IParameter pa = (IParameter) collector.getName(6).resolveBinding();
  640. IParameter pb = (IParameter) collector.getName(8).resolveBinding();
  641. IVariable a = (IVariable) collector.getName(15).resolveBinding();
  642. assertInstances(collector, s1, 3);
  643. assertInstances(collector, s2, 3);
  644. assertInstances(collector, d1, 3);
  645. assertInstances(collector, d2, 2);
  646. assertInstances(collector, f, 2);
  647. assertInstances(collector, pa, 2);
  648. assertInstances(collector, pb, 2);
  649. assertInstances(collector, a, 4);
  650. }
  651. public void testGCC20000605_2() throws Exception{
  652. StringBuilder buffer = new StringBuilder();
  653. buffer.append("struct F { int i; }; \n"); //$NON-NLS-1$
  654. buffer.append("void f1(struct F *x, struct F * y) { \n"); //$NON-NLS-1$
  655. buffer.append(" int timeout = 0; \n"); //$NON-NLS-1$
  656. buffer.append(" for (; ((const struct F*)x)->i < y->i; x->i++) \n"); //$NON-NLS-1$
  657. buffer.append(" if (++timeout > 5) \n"); //$NON-NLS-1$
  658. buffer.append(" return; \n"); //$NON-NLS-1$
  659. buffer.append("} \n"); //$NON-NLS-1$
  660. buffer.append("main() { \n"); //$NON-NLS-1$
  661. buffer.append(" struct F x, y; \n"); //$NON-NLS-1$
  662. buffer.append(" x.i = 0; y.i = 1; \n"); //$NON-NLS-1$
  663. buffer.append(" f1(&x, &y); \n"); //$NON-NLS-1$
  664. buffer.append("} \n"); //$NON-NLS-1$
  665. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  666. CNameCollector collector = new CNameCollector();
  667. tu.accept(collector);
  668. assertEquals(collector.size(), 27);
  669. ICompositeType F = (ICompositeType) collector.getName(0).resolveBinding();
  670. IField i = (IField) collector.getName(1).resolveBinding();
  671. IFunction f1 = (IFunction) collector.getName(2).resolveBinding();
  672. IParameter px = (IParameter) collector.getName(4).resolveBinding();
  673. IParameter py = (IParameter) collector.getName(6).resolveBinding();
  674. IVariable timeout = (IVariable) collector.getName(7).resolveBinding();
  675. IVariable x = (IVariable) collector.getName(18).resolveBinding();
  676. IVariable y = (IVariable) collector.getName(19).resolveBinding();
  677. assertInstances(collector, F, 5);
  678. assertInstances(collector, i, 6);
  679. assertInstances(collector, f1, 2);
  680. assertInstances(collector, px, 3);
  681. assertInstances(collector, py, 2);
  682. assertInstances(collector, timeout, 2);
  683. assertInstances(collector, x, 3);
  684. assertInstances(collector, y, 3);
  685. }
  686. public void testGCC20000605_3() throws Exception{
  687. StringBuilder buffer = new StringBuilder();
  688. buffer.append("struct F { int x; int y; }; \n"); //$NON-NLS-1$
  689. buffer.append("int main() { \n"); //$NON-NLS-1$
  690. buffer.append(" int timeout = 0, x = 0; \n"); //$NON-NLS-1$
  691. buffer.append(" while (1) { \n"); //$NON-NLS-1$
  692. buffer.append(" const struct F i = { x++, }; \n"); //$NON-NLS-1$
  693. buffer.append(" if (i.x > 0) \n"); //$NON-NLS-1$
  694. buffer.append(" break; \n"); //$NON-NLS-1$
  695. buffer.append(" if (++timeout > 5) \n"); //$NON-NLS-1$
  696. buffer.append(" goto die; \n"); //$NON-NLS-1$
  697. buffer.append(" } \n"); //$NON-NLS-1$
  698. buffer.append(" die: return 0; \n"); //$NON-NLS-1$
  699. buffer.append("} \n"); //$NON-NLS-1$
  700. IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
  701. CNameCollector collector = new CNameCollector();
  702. tu.accept(collector);
  703. assertEquals(collector.size(), 14);
  704. ICompositeType F = (ICompositeType) collector.getName(0).resolveBinding();
  705. IField fx = (IField) collector.getName(1).resolveBinding();
  706. IField fy = (IField) collector.getName(2).resolveBinding();
  707. IVariable timeout = (IVariable) collector.getName(4).resolveBinding();
  708. IVariable x = (IVariable) collector.getName(5).resolveBinding();
  709. IVariable i = (IVariable) collector.getName(7).resolveBinding();
  710. ILabel die = (ILabel) collector.getName(13).resolveBinding();
  711. assertInstances(collector, F, 2);
  712. assertInstances(collector, fx, 2);
  713. assertInstances(collector, fy, 1);
  714. assertInstances(collector, timeout, 2);
  715. assertInstances(collector, x, 2);