[clang] Dont print implicit forrange initializer
authorKadir Cetinkaya <kadircet@google.com>
Wed, 15 Jun 2022 14:56:19 +0000 (16:56 +0200)
committerKadir Cetinkaya <kadircet@google.com>
Fri, 17 Jun 2022 09:29:44 +0000 (11:29 +0200)
Fixes https://github.com/clangd/clangd/issues/1158

Differential Revision: https://reviews.llvm.org/D127863

clang/lib/AST/DeclPrinter.cpp
clang/unittests/AST/DeclPrinterTest.cpp

index faafe30..c6a392c 100644 (file)
@@ -895,12 +895,15 @@ void DeclPrinter::VisitVarDecl(VarDecl *D) {
   Expr *Init = D->getInit();
   if (!Policy.SuppressInitializers && Init) {
     bool ImplicitInit = false;
-    if (CXXConstructExpr *Construct =
-            dyn_cast<CXXConstructExpr>(Init->IgnoreImplicit())) {
+    if (D->isCXXForRangeDecl()) {
+      // FIXME: We should print the range expression instead.
+      ImplicitInit = true;
+    } else if (CXXConstructExpr *Construct =
+                   dyn_cast<CXXConstructExpr>(Init->IgnoreImplicit())) {
       if (D->getInitStyle() == VarDecl::CallInit &&
           !Construct->isListInitialization()) {
         ImplicitInit = Construct->getNumArgs() == 0 ||
-          Construct->getArg(0)->isDefaultArgument();
+                       Construct->getArg(0)->isDefaultArgument();
       }
     }
     if (!ImplicitInit) {
index c2d7d78..11dca6e 100644 (file)
@@ -1426,4 +1426,7 @@ TEST(DeclPrinter, VarDeclWithInitializer) {
   ASSERT_TRUE(PrintedDeclCXX17Matches(
       "int a = 0x15;", namedDecl(hasName("a")).bind("id"), "int a = 0x15",
       [](PrintingPolicy &Policy) { Policy.ConstantsAsWritten = true; }));
+  ASSERT_TRUE(
+      PrintedDeclCXX17Matches("void foo() {int arr[42]; for(int a : arr);}",
+                              namedDecl(hasName("a")).bind("id"), "int a"));
 }