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

Revert "Bug 549362 - Aggregate init for union-like classes"

This reverts commit 9a6fd2ab97.

A proper implementation is needed to resolve bug 551610.

Change-Id: I1ea353ea905a33dc43ceda59dde93c15de2032cd
Signed-off-by: Hannes Vogt <hannes@havogt.de>
This commit is contained in:
Hannes Vogt 2019-10-02 07:45:51 +02:00
parent 944ec0e06e
commit b52b03a9bc
2 changed files with 14 additions and 55 deletions

View file

@ -13394,18 +13394,6 @@ public class AST2CPPTests extends AST2CPPTestBase {
bh.assertImplicitName("t{1};", 1, IProblemBinding.class);
}
// struct MyStruct {
// union {
// int num;
// };
// };
// int main() {
// MyStruct test = { 0 };
// }
public void testAggregateInitOfAnonymousUnion_549362() throws Exception {
parseAndCheckImplicitNameBindings();
}
// namespace std {
// template<typename T> class initializer_list;
// }

View file

@ -239,28 +239,11 @@ public class ClassTypeHelper {
IASTDeclaration[] decls = host.getCompositeTypeSpecifier().getMembers();
for (IASTDeclaration decl : decls) {
if (decl instanceof IASTSimpleDeclaration) {
IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) decl;
IASTDeclarator[] dtors = simpleDecl.getDeclarators();
if (dtors.length == 0) {
// check for union-like classes [class.union.anon]
ICPPClassType nestedClass = getNestedClass(simpleDecl);
if (nestedClass != null && nestedClass.getName().length() == 0) {
if (nestedClass.getFields().length > 0) {
// TODO(havogt): Here we add only the first field of the anonymous union to the result
// (as needed for aggregate initialization, see [dcl.init.aggr](c++17)p.16).
// A proper solution will probably need to return a new implementation of ICPPField for anonymous unions.
// TODO(havogt): This branch is also taken for anonymous structs (GNU extension), in that case
// it should add all fields of the anonymous struct.
binding = nestedClass.getFields()[0];
result = ArrayUtil.appendAt(result, resultSize++, (ICPPField) binding);
}
}
} else {
for (IASTDeclarator dtor : dtors) {
binding = ASTQueries.findInnermostDeclarator(dtor).getName().resolveBinding();
if (binding instanceof ICPPField)
result = ArrayUtil.appendAt(result, resultSize++, (ICPPField) binding);
}
IASTDeclarator[] dtors = ((IASTSimpleDeclaration) decl).getDeclarators();
for (IASTDeclarator dtor : dtors) {
binding = ASTQueries.findInnermostDeclarator(dtor).getName().resolveBinding();
if (binding instanceof ICPPField)
result = ArrayUtil.appendAt(result, resultSize++, (ICPPField) binding);
}
} else if (decl instanceof ICPPASTUsingDeclaration) {
IASTName n = ((ICPPASTUsingDeclaration) decl).getName();
@ -277,7 +260,6 @@ public class ClassTypeHelper {
}
}
return ArrayUtil.trim(result, resultSize);
}
/**
@ -569,23 +551,6 @@ public class ClassTypeHelper {
return true;
}
/**
* @param decl
* @return if decl declares a nested class: return the class; else return null.
*/
public static ICPPClassType getNestedClass(IASTSimpleDeclaration decl) {
IBinding binding = null;
IASTDeclSpecifier declSpec = decl.getDeclSpecifier();
if (declSpec instanceof ICPPASTCompositeTypeSpecifier) {
binding = ((ICPPASTCompositeTypeSpecifier) declSpec).getName().resolveBinding();
} else if (declSpec instanceof ICPPASTElaboratedTypeSpecifier && decl.getDeclarators().length == 0) {
binding = ((ICPPASTElaboratedTypeSpecifier) declSpec).getName().resolveBinding();
}
if (binding instanceof ICPPClassType)
return (ICPPClassType) binding;
return null;
}
public static ICPPClassType[] getNestedClasses(ICPPInternalClassTypeMixinHost host) {
if (host.getDefinition() == null) {
host.checkForDefinition();
@ -606,10 +571,16 @@ public class ClassTypeHelper {
while (decl instanceof ICPPASTTemplateDeclaration)
decl = ((ICPPASTTemplateDeclaration) decl).getDeclaration();
if (decl instanceof IASTSimpleDeclaration) {
ICPPClassType nestedClass = getNestedClass((IASTSimpleDeclaration) decl);
if (nestedClass != null) {
result = ArrayUtil.appendAt(result, resultSize++, nestedClass);
IBinding binding = null;
IASTDeclSpecifier declSpec = ((IASTSimpleDeclaration) decl).getDeclSpecifier();
if (declSpec instanceof ICPPASTCompositeTypeSpecifier) {
binding = ((ICPPASTCompositeTypeSpecifier) declSpec).getName().resolveBinding();
} else if (declSpec instanceof ICPPASTElaboratedTypeSpecifier
&& ((IASTSimpleDeclaration) decl).getDeclarators().length == 0) {
binding = ((ICPPASTElaboratedTypeSpecifier) declSpec).getName().resolveBinding();
}
if (binding instanceof ICPPClassType)
result = ArrayUtil.appendAt(result, resultSize++, (ICPPClassType) binding);
}
}
return ArrayUtil.trim(result, resultSize);