/******************************************************************************* * Copyright (c) 2011, 2013 Google, Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Sergey Prigogin (Google) - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.index.tests; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import junit.framework.TestSuite; /** * Tests for header files included in multiple variants. * * The first line of each comment section preceding a test contains the name of the file * to put the contents of the section to. To request the AST of a file, put an asterisk after * the file name. */ public class IndexMultiVariantHeaderTest extends IndexBindingResolutionTestBase { public IndexMultiVariantHeaderTest() { setStrategy(new SinglePDOMTestNamedFilesStrategy(true)); } public static TestSuite suite() { return suite(IndexMultiVariantHeaderTest.class); } // test.h // #ifdef func // #undef func // #endif // // #define func(x) foo ## x // test.c * // #include "test.h" // // void func(1)() {} // // #undef func // #define func(x) bar ## x // // void func(2)() {} // // #include "test.h" // void func(3)() {} public void testExampleFromBug197989_Comment0() throws Exception { IFunction f1 = getBindingFromASTName("func(1)", 7, IFunction.class); assertEquals("foo1", f1.getName()); IFunction f2 = getBindingFromASTName("func(2)", 7, IFunction.class); assertEquals("bar2", f2.getName()); IFunction f3 = getBindingFromASTName("func(3)", 7, IFunction.class); assertEquals("foo3", f3.getName()); } // stddef.h // #if !defined(_STDDEF_H) || defined(__need_NULL) // // #if !defined(__need_NULL) // #define _STDDEF_H // #endif /* !defined(__need_NULL) */ // // #if defined(_STDDEF_H) || defined(__need_NULL) // #define NULL 0 // #endif /* defined(_STDDEF_H) || defined(__need_NULL) */ // #undef __need_NULL // // #if defined(_STDDEF_H) // typedef unsigned int size_t; // #endif /* defined(_STDDEF_H) */ // // #endif /* !defined(_STDDEF_H) || defined(__need_NULL) */ // a.h // #ifndef A_H_ // #define A_H_ // #include "stddef.h" // #endif /* A_H_ */ // a.cpp * // #define __need_NULL // #include "stddef.h" // void f1(char* p) {} // void test() { // f1(NULL); // } // b.cpp // #include "stddef.h" // #include "a.h" // c.cpp * // #include "a.h" // void f2(char* p, size_t t) {} // void test() { // f2(NULL, 1); // } public void testExampleFromBug197989_Comment73() throws Exception { getBindingFromASTName("f1(NULL)", 2, ICPPFunction.class); getBindingFromASTName("f2(NULL, 1)", 2, ICPPFunction.class); } // a.h // external int X; // b.h // #define X y // #include "a.h" // #undef X // #define X z // #include "a.h" // a.cpp * // #define X x // #include "a.h" // static void test() { // x = 0; // } // b.cpp * // #include "b.h" // static void test() { // y = 0; // z = 0; // } public void testSignificantMacroDetection() throws Exception { getBindingFromASTName("x = 0", 1, ICPPVariable.class); getBindingFromASTName("y = 0", 1, ICPPVariable.class); getBindingFromASTName("z = 0", 1, ICPPVariable.class); } // b.h // #ifndef _B // #define _B // #define SIG // This internal modification is not propagated // #endif // a.h // #include "b.h" // #ifdef SIG // Not significant, because it is defined in "b.h" // #endif // a.cpp * // #include "a.h" public void testSignificantMacroDetection_367753a() throws Exception { IASTName includeName= findName("a.h", 0); IASTPreprocessorIncludeStatement inc= (IASTPreprocessorIncludeStatement) includeName.getParent(); assertTrue(inc.isResolved()); assertEquals("{}", inc.getSignificantMacros().toString()); assertNotNull(inc.getImportedIndexFile()); } // c.h // #define SIG // This internal modification is not propagated // b.h // #ifndef _B // #define _B // #include "c.h" // #endif // a.h // #include "b.h" // #ifdef SIG // Not significant, because it is defined in "c.h" // #endif // a.cpp * // #include "a.h" public void testSignificantMacroDetection_367753b() throws Exception { IASTName includeName= findName("a.h", 0); IASTPreprocessorIncludeStatement inc= (IASTPreprocessorIncludeStatement) includeName.getParent(); assertTrue(inc.isResolved()); assertEquals("{}", inc.getSignificantMacros().toString()); assertNotNull(inc.getImportedIndexFile()); } }