llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: None (Red-RobinHood)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/167157.diff


3 Files Affected:

- (modified) clang/include/clang/Parse/Parser.h (+2) 
- (modified) clang/lib/Parse/ParseDeclCXX.cpp (+20-1) 
- (modified) clang/lib/Sema/SemaType.cpp (+11) 


``````````diff
diff --git a/clang/include/clang/Parse/Parser.h 
b/clang/include/clang/Parse/Parser.h
index dad8efd0f017f..b7b1b629f2d1e 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/include/clang/Parse/Parser.h
@@ -3787,6 +3787,8 @@ class Parser : public CodeCompletionHandler {
   /// true except when we are parsing an expression within a C++
   /// template argument list, where the '>' closes the template
   /// argument list.
+  SmallVector<TemplateParameterList *, 4> *TemplateParamsFromAlias = nullptr;
+
   bool GreaterThanIsOperator;
 
   // C++ type trait keywords that can be reverted to identifiers and still be
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index b96968d4592f5..8f30bc3c19409 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -889,6 +889,13 @@ Decl *Parser::ParseAliasDeclarationAfterDeclarator(
         << FixItHint::CreateRemoval(SourceRange(D.EllipsisLoc));
 
   Decl *DeclFromDeclSpec = nullptr;
+
+  TemplateParameterLists *SavedTemplateParamsFromAlias =
+      TemplateParamsFromAlias;
+  TemplateParamsFromAlias = TemplateInfo.TemplateParams;
+  TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams;
+  TemplateParamsFromAlias = SavedTemplateParamsFromAlias;
+
   TypeResult TypeAlias =
       ParseTypeName(nullptr,
                     TemplateInfo.Kind != ParsedTemplateKind::NonTemplate ? 
DeclaratorContext::AliasTemplate
@@ -904,7 +911,7 @@ Decl *Parser::ParseAliasDeclarationAfterDeclarator(
                                       : "alias declaration"))
     SkipUntil(tok::semi);
 
-  TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams;
+  TemplateParams = TemplateInfo.TemplateParams;
   MultiTemplateParamsArg TemplateParamsArg(
       TemplateParams ? TemplateParams->data() : nullptr,
       TemplateParams ? TemplateParams->size() : 0);
@@ -1543,6 +1550,18 @@ void Parser::ParseClassSpecifier(tok::TokenKind 
TagTokKind,
                                  DeclSpecContext DSC,
                                  ParsedAttributes &Attributes) {
   DeclSpec::TST TagType;
+
+  if (TemplateParamsFromAlias) {
+    for (TemplateParameterList *TPL : *TemplateParamsFromAlias) {
+      for (NamedDecl *ND : *TPL) {
+        ND->setInvalidDecl(true);
+        if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(ND)) {
+          TTPD->setTypeForDecl(Actions.Context.IntTy.getTypePtr());
+        }
+      }
+    }
+  }
+
   if (TagTokKind == tok::kw_struct)
     TagType = DeclSpec::TST_struct;
   else if (TagTokKind == tok::kw___interface)
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index eb8b1352d1be1..09c10b1d0cb5c 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -3417,6 +3417,17 @@ static QualType 
GetDeclSpecTypeForDeclarator(TypeProcessingState &state,
     }
   }
 
+  if (auto *CRD = dyn_cast_or_null<CXXRecordDecl>(OwnedTagDecl)) {
+    if (auto *CTD = CRD->getDescribedClassTemplate()) {
+      for (const NamedDecl *ND : CTD->getTemplateParameters()->asArray()) {
+        if (ND->isInvalidDecl()) {
+          D.setInvalidType(true);
+          return T;
+        }
+      }
+    }
+  }
+
   if (SemaRef.getLangOpts().CPlusPlus &&
       OwnedTagDecl && OwnedTagDecl->isCompleteDefinition()) {
     // Check the contexts where C++ forbids the declaration of a new class

``````````

</details>


https://github.com/llvm/llvm-project/pull/167157
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to