1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Testcase and fix for 164644, slash inside function style macro

This commit is contained in:
Markus Schorn 2006-11-15 16:15:07 +00:00
parent 10f16fe5d3
commit 3954755d03
3 changed files with 48 additions and 1 deletions

View file

@ -15,6 +15,7 @@
package org.eclipse.cdt.core.parser.tests.ast2; package org.eclipse.cdt.core.parser.tests.ast2;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import junit.framework.TestCase; import junit.framework.TestCase;
@ -23,7 +24,9 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.core.testplugin.FileManager; import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
@ -136,4 +139,9 @@ public class AST2FileBasePluginTest extends TestCase {
return file; return file;
} }
protected StringBuffer[] getContents(int sections) throws IOException {
return TestSourceReader.getContentsForTest(
CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), sections);
}
} }

View file

@ -11,6 +11,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2; package org.eclipse.cdt.core.parser.tests.ast2;
import java.io.File;
import java.util.Collections; import java.util.Collections;
import junit.framework.Test; import junit.framework.Test;
@ -609,4 +610,40 @@ public class DOMLocationInclusionTests extends AST2FileBasePluginTest {
assertFileLocation(incName, filename, code.lastIndexOf("TARG"), "TARG".length()); assertFileLocation(incName, filename, code.lastIndexOf("TARG"), "TARG".length());
} }
} }
// #define NAME test.h
// #define MAKE_INCLUDE(path, header) <path/header>
// #include MAKE_INCLUDE(test_bug164644, NAME)
public void testBug164644() throws Exception {
String tmpDir= System.getProperty("java.io.tmpdir");
File tmpFile= new File(tmpDir + "/test_bug164644/test.h").getCanonicalFile();
tmpFile.getParentFile().mkdirs();
tmpFile.createNewFile();
try {
String code= getContents(1)[0].toString();
IExtendedScannerInfo scannerInfo = new ExtendedScannerInfo(
Collections.EMPTY_MAP, new String[] {tmpDir}, null, null);
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
: null) {
String filename = (p == ParserLanguage.CPP) ? "main.cc" : "main.c";
IFile sfile = importFile(filename, code);
IASTTranslationUnit tu = parse(sfile, scannerInfo);
IASTPreprocessorIncludeStatement[] incs = tu.getIncludeDirectives();
assertNotNull(incs);
assertEquals(1, incs.length);
assertEquals(tmpFile.getAbsolutePath(), incs[0].getPath());
assertFileLocation(incs[0], filename, code.indexOf("#include MAKE_INCLUDE(test_bug164644, NAME)"), "#include MAKE_INCLUDE(test_bug164644, NAME)".length());
IASTPreprocessorIncludeStatement inc = incs[0];
IASTName incName= inc.getName();
assertEquals(true, inc.isSystemInclude());
}
}
finally {
tmpFile.delete();
tmpFile.getParentFile().delete();
}
}
} }

View file

@ -4397,9 +4397,10 @@ abstract class BaseScanner implements IScanner {
} else if (c == '/' && pos + 1 < limit) { } else if (c == '/' && pos + 1 < limit) {
// less than obvious, comments are whitespace // less than obvious, comments are whitespace
c = expansion[++pos]; c = expansion[pos+1];
if (c == '/') { if (c == '/') {
// copy up to here or before the last whitespace // copy up to here or before the last whitespace
++pos;
++lastcopy; ++lastcopy;
int n = wsstart < 0 ? pos - 1 - lastcopy : wsstart int n = wsstart < 0 ? pos - 1 - lastcopy : wsstart
- lastcopy; - lastcopy;
@ -4412,6 +4413,7 @@ abstract class BaseScanner implements IScanner {
// skip the rest // skip the rest
lastcopy = expansion.length - 1; lastcopy = expansion.length - 1;
} else if (c == '*') { } else if (c == '*') {
++pos;
if (wsstart < 1) if (wsstart < 1)
wsstart = pos - 1; wsstart = pos - 1;
while (++pos < limit) { while (++pos < limit) {