Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions lib/ClangImporter/ImportDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1612,6 +1612,14 @@ namespace {
if (!dc)
return nullptr;

// It's possible that we already encountered and imported decl while
// importing its decl context. If we are able to find a cached result,
// use it to avoid making a duplicate imported decl.
auto alreadyImported =
Impl.ImportedDecls.find({decl->getCanonicalDecl(), getVersion()});
if (alreadyImported != Impl.ImportedDecls.end())
return alreadyImported->second;

auto name = importedName.getBaseIdentifier(Impl.SwiftContext);

// Create the enum declaration and record it.
Expand Down
37 changes: 37 additions & 0 deletions test/ClangImporter/circular-import-as-member.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// RUN: split-file %s %t
// RUN: %target-swift-frontend -typecheck -verify -I %t/Inputs -cxx-interoperability-mode=default -module-name main %t/program.swift
// RUN: %target-swift-frontend -typecheck -verify -I %t/Inputs -cxx-interoperability-mode=off -module-name main %t/program.swift
// REQUIRES: objc_interop

//--- Inputs/module.modulemap
module TheModule {
header "the-header.h"
}

//--- Inputs/the-header.h
#pragma once

#define CF_SWIFT_NAME(_name) __attribute__((swift_name(#_name)))

#define __CF_OPTIONS_ATTRIBUTES __attribute__((flag_enum,enum_extensibility(open)))
#if (__cplusplus)
#define CF_OPTIONS(_type, _name) __attribute__((availability(swift,unavailable))) _type _name; enum __CF_OPTIONS_ATTRIBUTES : _name
#else
#define CF_OPTIONS(_type, _name) enum __CF_OPTIONS_ATTRIBUTES _name : _type _name; enum _name : _type
#endif

typedef CF_OPTIONS(unsigned, TheFlags) {
TheFlagsFoo = (1 << 1),
TheFlagsBar = (1 << 2)
} CF_SWIFT_NAME(The.Flags);

typedef TheFlags DaFlags;

struct TheContext {
TheFlags flags;
} CF_SWIFT_NAME(The);

//--- program.swift
import TheModule

func f(_ _: DaFlags) {}