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:
parent
944ec0e06e
commit
b52b03a9bc
2 changed files with 14 additions and 55 deletions
|
@ -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;
|
||||
// }
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue