From 5c5ce995f6eb390218a1ae5cdb17f23c15b3c6ef Mon Sep 17 00:00:00 2001 From: Hansruedi Patzen Date: Thu, 17 May 2018 14:34:38 +0200 Subject: [PATCH] Bug 534813 - ASTWriter swaps noexcept and pure virtual specifier Fix and test Change-Id: I14088e69aed829940fb1e9f5197dedf18d9bb7a5 Signed-off-by: Hansruedi Patzen Signed-off-by: Thomas Corbat --- .../rewrite/changegenerator/ReplaceTests.java | 27 +++++++++++++++++++ .../ASTWriterDeclaratorTestSource.awts | 1 + .../rewrite/astwriter/DeclaratorWriter.java | 8 +++--- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/ReplaceTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/ReplaceTests.java index 2c8a3c19cd5..0a477475d42 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/ReplaceTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/ReplaceTests.java @@ -1018,4 +1018,31 @@ public class ReplaceTests extends ChangeGeneratorTest { } }); } + + //struct FooInterface + //{ + // virtual void foo() throw (int); + //}; + + //struct FooInterface + //{ + // virtual void foo() throw (int) = 0; + //}; + public void testPureVirtualFunction() throws Exception { + compareResult(new ASTVisitor() { + { + shouldVisitDeclarators = true; + } + + @Override + public int visit(IASTDeclarator declarator) { + if (declarator instanceof ICPPASTFunctionDeclarator) { + ICPPASTFunctionDeclarator newDeclarator = (ICPPASTFunctionDeclarator) declarator.copy(CopyStyle.withLocations); + newDeclarator.setPureVirtual(true); + addModification(null, ModificationKind.REPLACE, declarator, newDeclarator); + } + return PROCESS_ABORT; + } + }); + } } diff --git a/core/org.eclipse.cdt.core.tests/resources/rewrite/ASTWriterDeclaratorTestSource.awts b/core/org.eclipse.cdt.core.tests/resources/rewrite/ASTWriterDeclaratorTestSource.awts index fe03601af54..734f54d2005 100644 --- a/core/org.eclipse.cdt.core.tests/resources/rewrite/ASTWriterDeclaratorTestSource.awts +++ b/core/org.eclipse.cdt.core.tests/resources/rewrite/ASTWriterDeclaratorTestSource.awts @@ -56,6 +56,7 @@ class TestClass int alpha; TestClass(int a); virtual void pure() = 0; + virtual void func() noexcept = 0; }; TestClass::TestClass(int a) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclaratorWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclaratorWriter.java index 4ea36fbcac3..18a961b08be 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclaratorWriter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclaratorWriter.java @@ -170,10 +170,6 @@ public class DeclaratorWriter extends NodeWriter { scribe.printSpace(); scribe.print(Keywords.MUTABLE); } - writeVirtualSpecifiers(funcDec); - if (funcDec.isPureVirtual()) { - scribe.print(PURE_VIRTUAL); - } writeExceptionSpecification(funcDec, funcDec.getExceptionSpecification(), funcDec.getNoexceptExpression()); writeAttributes(funcDec, EnumSet.of(SpaceLocation.BEFORE)); if (funcDec.getTrailingReturnType() != null) { @@ -182,6 +178,10 @@ public class DeclaratorWriter extends NodeWriter { scribe.printSpace(); funcDec.getTrailingReturnType().accept(visitor); } + writeVirtualSpecifiers(funcDec); + if (funcDec.isPureVirtual()) { + scribe.print(PURE_VIRTUAL); + } } public void writeVirtualSpecifiers(ICPPASTFunctionDeclarator funcDec) {