ayzhao 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();
----------------
rsmith wrote:
> 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.
Clang simply does not allow braced-initialization for `VariableArrayType`, even 
if `n` is greater than or equal to the number of initializers given:  
https://godbolt.org/z/MaPjvn694. I updated the patch to make parenthesized 
aggregate initialization do the same thing.


================
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);
----------------
rsmith wrote:
> 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?
> 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).

Done 

> Also, do we ever need to preserve type qualifiers from the original entity's 
> type?

I don't think so. In the case of `IncompleteArrayType`, which is the only 
situation where we would need to deduce the `ConstantArrayType` based on the 
number of arguments, the corresponding `QualType` object is always created with 
`Quals = 0` [0].

[0]: 
https://github.com/llvm/llvm-project/blob/c95533a7be2858893ec32b8abaa37a2d912ebe63/clang/lib/AST/ASTContext.cpp#L3888


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

1. This will never initialize a reference because it's initializing a base 
class.
1. In the case where the constructor of a base class accepts a reference 
parameter, the lifetime is not extended: https://godbolt.org/z/MaqhTr1rP


================
Comment at: clang/lib/Sema/SemaInit.cpp:5476
+          InitializedEntity SubEntity =
+              InitializedEntity::InitializeMemberFromDefaultMemberInitializer(
+                  FD);
----------------
rsmith wrote:
> 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.)
This now uses `InitializeMemberFromParenAggInit(..)` (before, it would emit 
[the same error it emits for braced init 
lists](https://godbolt.org/z/d3qfzh73z)). I also added a test for this.


================
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(
----------------
rsmith wrote:
> 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.
GCC rejects value initialization of references: https://godbolt.org/z/nhhehrf7r

This patch currently rejects value initialization of references, but I updated 
the diagnostics to match those Clang emits with braced initialization: 
https://godbolt.org/z/rbh17ecqe


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