Skip to content

Commit 69445e6

Browse files
authored
Merge pull request #65429 from rxwei/108280416
2 parents f781959 + 3ba2f87 commit 69445e6

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

lib/Sema/TypeCheckMacros.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,10 +1482,15 @@ ResolveMacroRequest::evaluate(Evaluator &evaluator,
14821482

14831483
auto &ctx = dc->getASTContext();
14841484
auto roles = macroRef.getMacroRoles();
1485-
auto foundMacros = TypeChecker::lookupMacros(
1486-
dc, macroRef.getMacroName(), SourceLoc(), roles);
1487-
if (foundMacros.empty())
1488-
return ConcreteDeclRef();
1485+
1486+
// When a macro is not found for a custom attribute, it may be a non-macro.
1487+
// So bail out to prevent diagnostics from the contraint system.
1488+
if (macroRef.getAttr()) {
1489+
auto foundMacros = TypeChecker::lookupMacros(
1490+
dc, macroRef.getMacroName(), SourceLoc(), roles);
1491+
if (foundMacros.empty())
1492+
return ConcreteDeclRef();
1493+
}
14891494

14901495
// If we already have a MacroExpansionExpr, use that. Otherwise,
14911496
// create one.

test/Macros/macros_diagnostics.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,7 @@ struct MyStruct<T: MyProto> {
185185

186186
@freestanding(expression) macro myMacro<T : MyProto>(_ value: MyStruct<T>) -> MyStruct<T> = #externalMacro(module: "A", type: "B")
187187
// expected-warning@-1{{external macro implementation type}}
188+
189+
#undefinedMacro { definitelyNotDefined }
190+
// expected-error@-1{{cannot find 'definitelyNotDefined' in scope}}
191+
// expected-error@-2{{no macro named 'undefinedMacro'}}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// REQUIRES: swift_swift_parser
2+
3+
// RUN: %target-typecheck-verify-swift -swift-version 5 -enable-experimental-feature FreestandingMacros -parse-as-library -module-name MacrosTest
4+
5+
// We need this test because top-level freestanding macro expansions are parsed
6+
// differently in library mode.
7+
8+
#undefinedMacro1
9+
// expected-error@-1{{no macro named 'undefinedMacro1'}}
10+
11+
#undefinedMacro2 { definitelyNotDefined }
12+
// expected-error@-1{{no macro named 'undefinedMacro2'}}
13+
// expected-error@-2{{cannot find 'definitelyNotDefined' in scope}}

0 commit comments

Comments
 (0)