rsmith added inline comments.

================
Comment at: clang/lib/Sema/SemaInit.cpp:5364-5368
     if (const ConstantArrayType *CAT =
             S.getASTContext().getAsConstantArrayType(Entity.getType()))
       ArrayLength = CAT->getSize().getZExtValue();
     else
       ArrayLength = Args.size();
----------------
What happens if the array is of `VariableArrayType` or 
`DependentSizedArrayType`? I guess we shouldn't get here in the latter case, 
but the former case seems possible, and presumably shouldn't result in 
constructing a value of `ConstantArrayType`. 
[Test](https://godbolt.org/z/377TWzn7r):

```
constexpr int f(int n, int i) {
    int arr[n](1, 2, 3);
    return arr[i];
}

constexpr int a = f(1, 2);
constexpr int b = f(4, 3);
```

GCC appears to leave the type alone in this case, and treats the evaluation as 
UB if `n` is less than the number of initializers given. That matches what GCC 
does for a `{...}` initializer of a VLA. We should probably match what Clang 
does for `{...}` initialization of a VLA and reject.


================
Comment at: clang/lib/Sema/SemaInit.cpp:5391-5393
+    ResultType = S.Context.getConstantArrayType(
+        AT->getElementType(), llvm::APInt(/*numBits=*/32, ArrayLength),
+        /*SizeExpr=*/nullptr, ArrayType::Normal, 0);
----------------
It would be nice to use the original type here in the case where we didn't add 
an array bound, so we preserve type sugar (typedefs etc). Also, do we ever need 
to preserve type qualifiers from the original entity's type?


================
Comment at: clang/lib/Sema/SemaInit.cpp:5401
+        InitializedEntity SubEntity =
+            InitializedEntity::InitializeBase(S.getASTContext(), &Base, false);
+        if (EntityIndexToProcess < Args.size()) {
----------------
Does this have the same wrong-lifetime-kind problem as members did?


================
Comment at: clang/lib/Sema/SemaInit.cpp:5476
+          InitializedEntity SubEntity =
+              InitializedEntity::InitializeMemberFromDefaultMemberInitializer(
+                  FD);
----------------
Does this entity kind do the right thing for lifetime warnings? (I'm not sure 
why this is a distinct kind of `InitializedEntity`; the thing that changes here 
is not the entity, it's how it's initialized.)


================
Comment at: clang/lib/Sema/SemaInit.cpp:5486-5487
+          //   The remaining elements...otherwise are value initialzed
+          InitializedEntity SubEntity =
+              InitializedEntity::InitializeMember(FD, &Entity);
+          InitializationKind SubKind = InitializationKind::CreateValue(
----------------
Is there any possibility of lifetime warnings here? I don't *think* value 
initialization can ever create problems, but it would seem more obviously right 
to use the parenthesized aggregate initialization entity kind here.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D148274/new/

https://reviews.llvm.org/D148274

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to