Skip to content

Commit a612702

Browse files
committed
Merge pull request swiftlang#65429 from rxwei/108280416
1 parent 46b5df0 commit a612702

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
@@ -1506,10 +1506,15 @@ ResolveMacroRequest::evaluate(Evaluator &evaluator,
15061506

15071507
auto &ctx = dc->getASTContext();
15081508
auto roles = macroRef.getMacroRoles();
1509-
auto foundMacros = TypeChecker::lookupMacros(
1510-
dc, macroRef.getMacroName(), SourceLoc(), roles);
1511-
if (foundMacros.empty())
1512-
return ConcreteDeclRef();
1509+
1510+
// When a macro is not found for a custom attribute, it may be a non-macro.
1511+
// So bail out to prevent diagnostics from the contraint system.
1512+
if (macroRef.getAttr()) {
1513+
auto foundMacros = TypeChecker::lookupMacros(
1514+
dc, macroRef.getMacroName(), SourceLoc(), roles);
1515+
if (foundMacros.empty())
1516+
return ConcreteDeclRef();
1517+
}
15131518

15141519
// If we already have a MacroExpansionExpr, use that. Otherwise,
15151520
// 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)