ChuanqiXu requested review of this revision. ChuanqiXu added inline comments.
================ Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:7784-7785 "because namespace %1 does not enclose namespace %2">; +def err_invalid_declarator_in_export : Error<"cannot export %0 here " + "because it had be declared in %1.">; def err_invalid_declarator_global_scope : Error< ---------------- ChuanqiXu wrote: > urnathan wrote: > > aaron.ballman wrote: > > > ChuanqiXu wrote: > > > > aaron.ballman wrote: > > > > > aaron.ballman wrote: > > > > > > I think this diagnostic text is more clear based on the standards > > > > > > text you cited. This would also come with a note diagnostic to > > > > > > point to the previous declaration. > > > > > Given that this is not intended for p6 specifically, I think my > > > > > suggestion is incorrect. But I am also not certain your diagnostic is > > > > > either, but it's really hard to tell given where our current support > > > > > is for modules. All of the other compilers suggest that an > > > > > unqualified id is expected to be found, and I tend to agree -- > > > > > there's no declaration there *to* export, just the type specifier for > > > > > a declaration. This makes me think the issue is elsewhere and perhaps > > > > > we shouldn't even be getting into `diagnoseQualifiedDeclaration()`. > > > > I think we need to touch `diagnoseQualifiedDeclaration()` after all. > > > > Since there is a potential risk of crashing in it. If we didn't fix it > > > > in `diagnoseQualifiedDeclaration()` and find other place to fix the > > > > issue, I think it may crash potentially one day in the process of > > > > developing or we might ignore some paths to > > > > diagnoseQualifiedDeclaration()`. It would be a disaster. > > > > And you said "there's no declaration there *to* export". And I noticed > > > > that there is error/warning in `Sema::ParsedFreeStandingDeclSpec` which > > > > would emit this kind of error/warning. But as the title describes, it > > > > only works for free standing declaration, which is not the same with > > > > the issue in bug47715. And `diagnoseQualifiedDeclaration()` would > > > > handle the qualified redeclaration. So it looks a good place to me. > > > > BTW, I found the current patch could handle [module.interface]/p6 > > > > partially for qualified redeclaration surprisingly. See the newly added > > > > test case for example. > > > > Finally, given that we need to touch `diagnoseQualifiedDeclaration()` > > > > to fix the crash, I think the patch should be good and we could try to > > > > cover [module.interface]/p6 in successive patches. Do you think so? > > > > I think we need to touch diagnoseQualifiedDeclaration() after all. > > > > Since there is a potential risk of crashing in it. > > > > > > My point is that we may have wanted to reject this code before ever > > > needing to call `diagnoseQualifiedDeclaration()` in the first place. aka, > > > it might be just as valid to assert we never see an `ExportDecl` here > > > because the caller should have already handled that case. > > > > > > > And you said "there's no declaration there *to* export". And I noticed > > > > that there is error/warning in Sema::ParsedFreeStandingDeclSpec which > > > > would emit this kind of error/warning. But as the title describes, it > > > > only works for free standing declaration, which is not the same with > > > > the issue in bug47715. > > > > > > The declaration is invalid in C++20 because it does not declare anything > > > (this is the same example with the export keywords removed): > > > https://godbolt.org/z/8zc9q7fno > > > > > > Clang fails the first one because we don't yet implement P0634R3, but the > > > presence of the export keyword should not change diagnostic behavior here. > > > > > > > > Agreed, 'export' is only applicable to namespace-scope declarations. We > > should reject it applying to non-namepace-scope entities. > Got it. It is important to make the code semantics consistent with the spec. @aaron.ballman @urnathan I have sent a draft to reject the codes before `diagnoseQualifiedDeclaration()`. The draft is here: https://reviews.llvm.org/D113239. The draft is not completed to review the details. The key idea is to insert checks for `ExportDecl` on the fly to construct the AST. Due to the complexity of semantics analysis , we might need to insert the checks many times. It may not be too terrible since I found many `Check*` functions in `Sema`. So may be this is what we used to do. And the draft could reject the example in https://eel.is/c++draft/module.interface#6. It looks like not so hard as I imaged. BTW, I have tried to let the compiler to emit "declaration does not declare anything" when it sees "export template <typename T> X<T>::Y". But I failed. It is not easy for me. And I found that the compiler wouldn't emit "declaration does not declare anything" when the declaration is in a `DeclContext`. Here is an example: https://godbolt.org/z/3j63PnTc7. So the compiler used to handle this case in `diagnoseQualifiedDeclaration()`. Personally, it looks not bad to handle `export template<> X::Y` in `diagnoseQualifiedDeclaration()` at least from the names. And I am wondering if we could export a non-namespace-scope name without using qualifiers? If no, it looks better for me to handle this in `diagnoseQualifiedDeclaration()`. BTW, the following example is **not** what I meant: ``` struct X { struct Y {}; }; export using Z = typename X::Y; ``` Finally, it looks like we need to touch `diagnoseQualifiedDeclaration()` after all. Otherwise, it would crash for that example. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D112903/new/ https://reviews.llvm.org/D112903 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits