
Use declaresSameEntity when evaluating constexpr to avoid resetting computed union value due to using different instances of the merged field decl.
45 lines
973 B
C++
45 lines
973 B
C++
// RUN: rm -fR %t
|
|
// RUN: split-file %s %t
|
|
// RUN: cd %t
|
|
// RUN: %clang_cc1 -verify -w -std=c++20 -fmodule-name=h1.h -emit-header-unit -xc++-user-header h1.h -o h1.pcm
|
|
// RUN: %clang_cc1 -verify -w -std=c++20 -fmodule-map-file=module.modulemap -fmodule-file=h1.h=h1.pcm main.cpp -o main.o
|
|
|
|
//--- module.modulemap
|
|
module "h1.h" {
|
|
header "h1.h"
|
|
export *
|
|
}
|
|
|
|
//--- h0.h
|
|
// expected-no-diagnostics
|
|
#pragma once
|
|
|
|
template <typename T> struct A {
|
|
union {
|
|
struct {
|
|
T x, y, z;
|
|
};
|
|
};
|
|
constexpr A(T, T, T) : x(), y(), z() {}
|
|
};
|
|
typedef A<float> packed_vec3;
|
|
|
|
//--- h1.h
|
|
// expected-no-diagnostics
|
|
#pragma once
|
|
|
|
#include "h0.h"
|
|
|
|
constexpr packed_vec3 kMessThingsUp = packed_vec3(5.0f, 5.0f, 5.0f);
|
|
|
|
//--- main.cpp
|
|
// expected-no-diagnostics
|
|
#include "h0.h"
|
|
|
|
static_assert(sizeof(packed_vec3) == sizeof(float) * 3);
|
|
static_assert(alignof(packed_vec3) == sizeof(float));
|
|
|
|
import "h1.h";
|
|
|
|
constexpr packed_vec3 kDefaultHalfExtents = packed_vec3(5.0f, 5.0f, 5.0f);
|