rZhBoYao created this revision. rZhBoYao added reviewers: rsmith, aaron.ballman, erichkeane, v.g.vassilev, rnk. rZhBoYao added a project: clang. rZhBoYao requested review of this revision. Herald added a subscriber: cfe-commits.
This should fix Bug 28101 <https://bugs.llvm.org/show_bug.cgi?id=28101> where the culprit line is parsed as `FieldDecl 0x2136240 <line:6:3, col:16> col:6 'T':'T'`(why not `A<T>` tho?). I observed that GCC(trunk on godbolt.org) would issue: `<source>:6:6: error: field 'int A<int>::A' with same name as class`, which corresponds to clang's `diag::err_member_name_of_class`. But as the dumped AST shows, there is no name on the FieldDecl, and then I found clang would issue `diag::err_expected_member_name_or_semi` on `int (double) {};`, which resembles `T (A < T >) {};` so I went with this error. I am ready to be corrected as I'm new to clang and this differs from GCC's behavior. Any guidance and comments would be appreciated. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D115248 Files: clang/lib/Parse/ParseDecl.cpp clang/lib/Sema/SemaDeclCXX.cpp Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -15440,6 +15440,11 @@ break; } } + if (LLVM_UNLIKELY(!Pattern)) + for (const auto *FD : ClassPattern->fields()) + if (Diags.hasErrorOccurred() && !FD->getIdentifier()) { + return ExprError(); + } assert(Pattern && "We must have set the Pattern!"); if (!Pattern->hasInClassInitializer() || Index: clang/lib/Parse/ParseDecl.cpp =================================================================== --- clang/lib/Parse/ParseDecl.cpp +++ clang/lib/Parse/ParseDecl.cpp @@ -6205,6 +6205,11 @@ // is exited (and the declarator has been parsed). DeclScopeObj.EnterDeclaratorScope(); } + if (D.hasName() && !D.getIdentifier()) + Diag(getMissingDeclaratorIdLoc(D, Tok.getLocation()), + diag::err_expected_member_name_or_semi) + << (D.getDeclSpec().isEmpty() ? SourceRange() + : D.getDeclSpec().getSourceRange()); } else if (D.mayOmitIdentifier()) { // This could be something simple like "int" (in which case the declarator // portion is empty), if an abstract-declarator is allowed.
Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -15440,6 +15440,11 @@ break; } } + if (LLVM_UNLIKELY(!Pattern)) + for (const auto *FD : ClassPattern->fields()) + if (Diags.hasErrorOccurred() && !FD->getIdentifier()) { + return ExprError(); + } assert(Pattern && "We must have set the Pattern!"); if (!Pattern->hasInClassInitializer() || Index: clang/lib/Parse/ParseDecl.cpp =================================================================== --- clang/lib/Parse/ParseDecl.cpp +++ clang/lib/Parse/ParseDecl.cpp @@ -6205,6 +6205,11 @@ // is exited (and the declarator has been parsed). DeclScopeObj.EnterDeclaratorScope(); } + if (D.hasName() && !D.getIdentifier()) + Diag(getMissingDeclaratorIdLoc(D, Tok.getLocation()), + diag::err_expected_member_name_or_semi) + << (D.getDeclSpec().isEmpty() ? SourceRange() + : D.getDeclSpec().getSourceRange()); } else if (D.mayOmitIdentifier()) { // This could be something simple like "int" (in which case the declarator // portion is empty), if an abstract-declarator is allowed.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits