llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Shahid Iqbal (shahidiqbal13) <details> <summary>Changes</summary> - Raising for preliminary review (forget about formating) - Fixed the '...' catch all ellipsis in catch stmt - Will fix the failed testcases once we get agree on this - I don't think we need to support for the variadic function support ellipsis token this usecase [void bar(int, ...); ] - See the issue here: https://github.com/llvm/llvm-project/issues/63106 Output of the fixed 1st issue (catch(...)) ``` `-FunctionDecl 0x55bdaf78d9a0 <test1.cpp:1:1, line:4:1> line:1:6 foo 'void ()' `-CompoundStmt 0x55bdaf78dbb8 <col:12, line:4:1> `-CXXTryStmt 0x55bdaf78db98 <line:2:3, line:3:14> |-CompoundStmt 0x55bdaf78da90 <line:2:7, col:8> `-CXXCatchStmt 0x55bdaf78db78 <line:3:3, col:14> |-VarDecl 0x55bdaf78db00 <<invalid sloc>, col:12> col:12 catch_all '<unknown type>' `-CompoundStmt 0x55bdaf78db68 <col:13, col:14> ``` --- Full diff: https://github.com/llvm/llvm-project/pull/80976.diff 7 Files Affected: - (modified) clang/NOTES.txt (+2) - (modified) clang/include/clang/AST/DeclBase.h (+9-2) - (modified) clang/include/clang/Sema/Sema.h (+1-1) - (modified) clang/lib/AST/TextNodeDumper.cpp (+3) - (modified) clang/lib/Parse/ParseStmt.cpp (+11-3) - (modified) clang/lib/Sema/SemaDeclCXX.cpp (+5-2) - (modified) clang/test/AST/ast-dump-stmt.cpp (+1-1) ``````````diff diff --git a/clang/NOTES.txt b/clang/NOTES.txt index f06ea8c70cd34..c83dda52a1fc2 100644 --- a/clang/NOTES.txt +++ b/clang/NOTES.txt @@ -4,6 +4,8 @@ //===---------------------------------------------------------------------===// +//TESTING git infra// + To time GCC preprocessing speed without output, use: "time gcc -MM file" This is similar to -Eonly. diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index 5b1038582bc67..67f5c7dd1b7f9 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -301,6 +301,9 @@ class alignas(8) Decl { LLVM_PREFERRED_TYPE(bool) unsigned Implicit : 1; + LLVM_PREFERRED_TYPE(bool) + unsigned HasCatchEllipsis : 1; + /// Whether this declaration was "used", meaning that a definition is /// required. LLVM_PREFERRED_TYPE(bool) @@ -394,7 +397,7 @@ class alignas(8) Decl { Decl(Kind DK, DeclContext *DC, SourceLocation L) : NextInContextAndBits(nullptr, getModuleOwnershipKindForChildOf(DC)), DeclCtx(DC), Loc(L), DeclKind(DK), InvalidDecl(false), HasAttrs(false), - Implicit(false), Used(false), Referenced(false), + Implicit(false), HasCatchEllipsis(false), Used(false), Referenced(false), TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0), IdentifierNamespace(getIdentifierNamespaceForKind(DK)), CacheValidAndLinkage(llvm::to_underlying(Linkage::Invalid)) { @@ -402,7 +405,7 @@ class alignas(8) Decl { } Decl(Kind DK, EmptyShell Empty) - : DeclKind(DK), InvalidDecl(false), HasAttrs(false), Implicit(false), + : DeclKind(DK), InvalidDecl(false), HasAttrs(false), Implicit(false), HasCatchEllipsis(false), Used(false), Referenced(false), TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0), IdentifierNamespace(getIdentifierNamespaceForKind(DK)), @@ -597,6 +600,10 @@ class alignas(8) Decl { bool isImplicit() const { return Implicit; } void setImplicit(bool I = true) { Implicit = I; } + /// isCatchEllipsisTok - Indicates whether '...' is present in the catch decl + bool isCatchEllipsisTok() const { return HasCatchEllipsis; } + void setCatchEllipsisTok(bool I = true) { HasCatchEllipsis = I; } + /// Whether *any* (re-)declaration of the entity was used, meaning that /// a definition is required. /// diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 501dc01200a1c..ffc6d2926f85f 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -5322,7 +5322,7 @@ class Sema final { SourceLocation IdLoc, IdentifierInfo *Id); - Decl *ActOnExceptionDeclarator(Scope *S, Declarator &D); + Decl *ActOnExceptionDeclarator(Scope *S, Declarator &D, bool isCatchAll = false); StmtResult ActOnCXXCatchBlock(SourceLocation CatchLoc, Decl *ExDecl, Stmt *HandlerBlock); diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp index e8274fcd5cfe9..1da20cdfa36a6 100644 --- a/clang/lib/AST/TextNodeDumper.cpp +++ b/clang/lib/AST/TextNodeDumper.cpp @@ -272,6 +272,9 @@ void TextNodeDumper::Visit(const Decl *D) { if (D->isImplicit()) OS << " implicit"; + if (D->isCatchEllipsisTok()) + OS << " catch_all "; + if (D->isUsed()) OS << " used"; else if (D->isThisDeclarationReferenced()) diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index 2531147c23196..56c1e86afd481 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -2698,9 +2698,17 @@ StmtResult Parser::ParseCXXCatchBlock(bool FnCatch) { Declarator ExDecl(DS, Attributes, DeclaratorContext::CXXCatch); ParseDeclarator(ExDecl); ExceptionDecl = Actions.ActOnExceptionDeclarator(getCurScope(), ExDecl); - } else - ConsumeToken(); - + } + else { + ConsumeToken(); + // explicitly creating a var of type no-type for '...' and marking it as catch_all + ParsedAttributes Attributes(AttrFactory); + DeclSpec DS(AttrFactory); + Declarator ExDecl(DS, Attributes, DeclaratorContext::BlockLiteral); + ParseDeclarator(ExDecl); + ExceptionDecl = Actions.ActOnExceptionDeclarator(getCurScope(), ExDecl, true); + ExceptionDecl->setCatchEllipsisTok(); + } T.consumeClose(); if (T.getCloseLocation().isInvalid()) return StmtError(); diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 3688192e6cbe5..1916d3c3d8ebd 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -16983,7 +16983,7 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S, /// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch /// handler. -Decl *Sema::ActOnExceptionDeclarator(Scope *S, Declarator &D) { +Decl *Sema::ActOnExceptionDeclarator(Scope *S, Declarator &D, bool isCatchAll) { TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S); bool Invalid = D.isInvalidType(); @@ -16994,6 +16994,9 @@ Decl *Sema::ActOnExceptionDeclarator(Scope *S, Declarator &D) { D.getIdentifierLoc()); Invalid = true; } + if (isCatchAll) + TInfo = Context.getTrivialTypeSourceInfo(Context.UnknownAnyTy, + D.getIdentifierLoc()); IdentifierInfo *II = D.getIdentifier(); if (NamedDecl *PrevDecl = LookupSingleName(S, II, D.getIdentifierLoc(), @@ -17021,7 +17024,7 @@ Decl *Sema::ActOnExceptionDeclarator(Scope *S, Declarator &D) { VarDecl *ExDecl = BuildExceptionDeclaration( S, TInfo, D.getBeginLoc(), D.getIdentifierLoc(), D.getIdentifier()); - if (Invalid) + if (Invalid && !isCatchAll) ExDecl->setInvalidDecl(); // Add the exception declaration into this scope. diff --git a/clang/test/AST/ast-dump-stmt.cpp b/clang/test/AST/ast-dump-stmt.cpp index 407584e5b82de..a5a7e9d535c1d 100644 --- a/clang/test/AST/ast-dump-stmt.cpp +++ b/clang/test/AST/ast-dump-stmt.cpp @@ -41,7 +41,7 @@ void TestCatch2() { try { } // CHECK-NEXT: CXXCatchStmt -// CHECK-NEXT: NULL +// CHECK-NEXT: VarDecl {{.*}} '<unknown type>' // CHECK-NEXT: CompoundStmt catch (...) { } `````````` </details> https://github.com/llvm/llvm-project/pull/80976 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits