diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuiltinSpecsDetectorTest.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuiltinSpecsDetectorTest.java index d8f3eab1379..6caaee1d3ae 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuiltinSpecsDetectorTest.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuiltinSpecsDetectorTest.java @@ -401,6 +401,36 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase { assertEquals(1, entries.size()); } + + /** + * Test parsing of include directives included multiple times. + */ + public void testGCCBuiltinSpecsDetector_Includes_Duplicates() throws Exception { + // Create model project and folders to test + String projectName = getName(); + IProject project = ResourceHelper.createCDTProject(projectName); + IPath tmpPath = ResourceHelper.createTemporaryFolder(); + ResourceHelper.createFolder(project, "/usr/include"); + String loc = tmpPath.toString(); + + MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector(); + detector.startup(null, null); + detector.startupForLanguage(null); + + detector.processLine("#include <...> search starts here:"); + detector.processLine(" "+loc+"/usr/include"); + detector.processLine(" "+loc+"/usr/include"); + detector.processLine(" "+loc+"/usr/include/"); + detector.processLine(" "+loc+"/usr/include/../include"); + detector.processLine("End of search list."); + detector.shutdownForLanguage(); + detector.shutdown(); + + List entries = detector.getSettingEntries(null, null, null); + int index = 0; + assertEquals(new CIncludePathEntry(loc+"/usr/include", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY), entries.get(index++)); + assertEquals(index, entries.size()); + } /** * Test parsing of include directives for Cygwin for global provider. */ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java index 09aa575fba3..1b6377ee9ae 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java @@ -700,7 +700,11 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti // Built-in specs detectors collect entries not per line but for the whole output // so collect them to save later when output finishes if (entries != null) { - detectedSettingEntries.addAll(entries); + for (ICLanguageSettingEntry entry : entries) { + if (!detectedSettingEntries.contains(entry)) { + detectedSettingEntries.add(entry); + } + } } }