clang: Enable -Weverything, fix all warnings

This change fixes the following warnings:

```
    -Wc++98-compat-extra-semi
    -Wc++98-compat-local-type-template-args
    -Wc++98-compat-pedantic
    -Wc++98-compat
    -Wcomma
    -Wdeprecated-copy-dtor
    -Wexit-time-destructors
    -Wextra-semi-stmt
    -Wextra-semi
    -Wfloat-conversion
    -Wfloat-equal
    -Wformat-nonliteral
    -Wglobal-constructors
    -Winconsistent-missing-destructor-override
    -Wnon-virtual-dtor
    -Wold-style-cast
    -Wpadded
    -Wreturn-std-move-in-c++11
    -Wshadow-field-in-constructor
    -Wshadow-uncaptured-local
    -Wshift-sign-overflow
    -Wsign-conversion
    -Wundef
    -Wunreachable-code-return
    -Wused-but-marked-unused
    -Wweak-vtables
    -Wzero-as-null-pointer-constant
```
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bba7f63..a41d6ae 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -78,6 +78,7 @@
     ${CPPDAP_SRC_DIR}/protocol_types.cpp
     ${CPPDAP_SRC_DIR}/session.cpp
     ${CPPDAP_SRC_DIR}/socket.cpp
+    ${CPPDAP_SRC_DIR}/typeinfo.cpp
     ${CPPDAP_SRC_DIR}/typeof.cpp
 )
 
diff --git a/include/dap/future.h b/include/dap/future.h
index abc8abf..4b2d5f2 100644
--- a/include/dap/future.h
+++ b/include/dap/future.h
@@ -89,7 +89,7 @@
 };
 
 template <typename T>
-future<T>::future(const std::shared_ptr<State>& state) : state(state) {}
+future<T>::future(const std::shared_ptr<State>& s) : state(s) {}
 
 template <typename T>
 bool future<T>::valid() const {
diff --git a/include/dap/protocol.h b/include/dap/protocol.h
index 7364bad..c45d421 100644
--- a/include/dap/protocol.h
+++ b/include/dap/protocol.h
@@ -37,10 +37,7 @@
 
 // Response to 'attach' request. This is just an acknowledgement, so no body
 // field is required.
-struct AttachResponse : public Response {
-  AttachResponse();
-  ~AttachResponse();
-};
+struct AttachResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(AttachResponse);
 
@@ -49,10 +46,6 @@
 // specific, the arguments for this request are not part of this specification.
 struct AttachRequest : public Request {
   using Response = AttachResponse;
-
-  AttachRequest();
-  ~AttachRequest();
-
   // Optional data from the previous, restarted session.
   // The data is sent as the 'restart' attribute of the 'terminated' event.
   // The client should leave the data intact.
@@ -63,18 +56,12 @@
 DAP_DECLARE_STRUCT_TYPEINFO(AttachRequest);
 
 // Names of checksum algorithms that may be supported by a debug adapter.
-struct ChecksumAlgorithm {
-  ChecksumAlgorithm();
-  ~ChecksumAlgorithm();
-};
+struct ChecksumAlgorithm {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(ChecksumAlgorithm);
 
 // The checksum of an item calculated by the specified algorithm.
 struct Checksum {
-  Checksum();
-  ~Checksum();
-
   // The algorithm used to calculate this checksum.
   ChecksumAlgorithm algorithm;
   // Value of the checksum.
@@ -87,9 +74,6 @@
 // It is returned from the debug adapter as part of a StackFrame and it is used
 // by clients when specifying breakpoints.
 struct Source {
-  Source();
-  ~Source();
-
   // Optional data that a debug adapter might want to loop through the client.
   // The client should leave the data intact and persist it across sessions. The
   // client should not interpret the data.
@@ -130,9 +114,6 @@
 // Information about a Breakpoint created in setBreakpoints,
 // setFunctionBreakpoints, setInstructionBreakpoints, or setDataBreakpoints.
 struct Breakpoint {
-  Breakpoint();
-  ~Breakpoint();
-
   // An optional start column of the actual range covered by the breakpoint.
   optional<integer> column;
   // An optional end column of the actual range covered by the breakpoint.
@@ -166,9 +147,6 @@
 
 // The event indicates that some information about a breakpoint has changed.
 struct BreakpointEvent : public Event {
-  BreakpointEvent();
-  ~BreakpointEvent();
-
   // The 'id' attribute is used to find the target breakpoint and the other
   // attributes are used as the new values.
   Breakpoint breakpoint;
@@ -184,9 +162,6 @@
 // Properties of a breakpoint location returned from the 'breakpointLocations'
 // request.
 struct BreakpointLocation {
-  BreakpointLocation();
-  ~BreakpointLocation();
-
   // Optional start column of breakpoint location.
   optional<integer> column;
   // Optional end column of breakpoint location if the location covers a range.
@@ -202,9 +177,6 @@
 // Response to 'breakpointLocations' request.
 // Contains possible locations for source breakpoints.
 struct BreakpointLocationsResponse : public Response {
-  BreakpointLocationsResponse();
-  ~BreakpointLocationsResponse();
-
   // Sorted set of possible breakpoint locations.
   array<BreakpointLocation> breakpoints;
 };
@@ -216,10 +188,6 @@
 // capability 'supportsBreakpointLocationsRequest' is true.
 struct BreakpointLocationsRequest : public Request {
   using Response = BreakpointLocationsResponse;
-
-  BreakpointLocationsRequest();
-  ~BreakpointLocationsRequest();
-
   // Optional start column of range to search possible breakpoint locations in.
   // If no start column is given, the first column in the start line is assumed.
   optional<integer> column;
@@ -242,10 +210,7 @@
 
 // Response to 'cancel' request. This is just an acknowledgement, so no body
 // field is required.
-struct CancelResponse : public Response {
-  CancelResponse();
-  ~CancelResponse();
-};
+struct CancelResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(CancelResponse);
 
@@ -270,10 +235,6 @@
 //  sending the 'cancel' request.
 struct CancelRequest : public Request {
   using Response = CancelResponse;
-
-  CancelRequest();
-  ~CancelRequest();
-
   // The ID (attribute 'progressId') of the progress to cancel. If missing no
   // progress is cancelled. Both a 'requestId' and a 'progressId' can be
   // specified in one request.
@@ -290,9 +251,6 @@
 // ModulesView, how to format it, and what the column's label should be. It is
 // only used if the underlying UI actually supports this level of customization.
 struct ColumnDescriptor {
-  ColumnDescriptor();
-  ~ColumnDescriptor();
-
   // Name of the attribute rendered in this column.
   string attributeName;
   // Format to use for the rendered values in this column. TBD how the format
@@ -314,9 +272,6 @@
 // An ExceptionBreakpointsFilter is shown in the UI as an option for configuring
 // how exceptions are dealt with.
 struct ExceptionBreakpointsFilter {
-  ExceptionBreakpointsFilter();
-  ~ExceptionBreakpointsFilter();
-
   // Initial value of the filter. If not specified a value 'false' is assumed.
   optional<boolean> def;
   // The internal ID of the filter. This value is passed to the
@@ -330,9 +285,6 @@
 
 // Information about the capabilities of a debug adapter.
 struct Capabilities {
-  Capabilities();
-  ~Capabilities();
-
   // The set of additional module information exposed by the debug adapter.
   optional<array<ColumnDescriptor>> additionalModuleColumns;
   // The set of characters that should trigger completion in a REPL. If not
@@ -430,9 +382,6 @@
 // guarantees. Only changed capabilities need to be included, all other
 // capabilities keep their values.
 struct CapabilitiesEvent : public Event {
-  CapabilitiesEvent();
-  ~CapabilitiesEvent();
-
   // The set of updated capabilities.
   Capabilities capabilities;
 };
@@ -441,18 +390,12 @@
 
 // Some predefined types for the CompletionItem. Please note that not all
 // clients have specific icons for all of them.
-struct CompletionItemType {
-  CompletionItemType();
-  ~CompletionItemType();
-};
+struct CompletionItemType {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(CompletionItemType);
 
 // CompletionItems are the suggestions returned from the CompletionsRequest.
 struct CompletionItem {
-  CompletionItem();
-  ~CompletionItem();
-
   // The label of this completion item. By default this is also the text that is
   // inserted when selecting this completion.
   string label;
@@ -487,9 +430,6 @@
 
 // Response to 'completions' request.
 struct CompletionsResponse : public Response {
-  CompletionsResponse();
-  ~CompletionsResponse();
-
   // The possible completions for .
   array<CompletionItem> targets;
 };
@@ -501,10 +441,6 @@
 // 'supportsCompletionsRequest' is true.
 struct CompletionsRequest : public Request {
   using Response = CompletionsResponse;
-
-  CompletionsRequest();
-  ~CompletionsRequest();
-
   // The character position for which to determine the completion proposals.
   integer column;
   // Returns completions in the scope of this stack frame. If not specified, the
@@ -522,10 +458,7 @@
 
 // Response to 'configurationDone' request. This is just an acknowledgement, so
 // no body field is required.
-struct ConfigurationDoneResponse : public Response {
-  ConfigurationDoneResponse();
-  ~ConfigurationDoneResponse();
-};
+struct ConfigurationDoneResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(ConfigurationDoneResponse);
 
@@ -536,18 +469,12 @@
 // 'supportsConfigurationDoneRequest' is true.
 struct ConfigurationDoneRequest : public Request {
   using Response = ConfigurationDoneResponse;
-
-  ConfigurationDoneRequest();
-  ~ConfigurationDoneRequest();
 };
 
 DAP_DECLARE_STRUCT_TYPEINFO(ConfigurationDoneRequest);
 
 // Response to 'continue' request.
 struct ContinueResponse : public Response {
-  ContinueResponse();
-  ~ContinueResponse();
-
   // If true, the 'continue' request has ignored the specified thread and
   // continued all threads instead. If this attribute is missing a value of
   // 'true' is assumed for backward compatibility.
@@ -559,10 +486,6 @@
 // The request starts the debuggee to run again.
 struct ContinueRequest : public Request {
   using Response = ContinueResponse;
-
-  ContinueRequest();
-  ~ContinueRequest();
-
   // Continue execution for the specified thread (if possible).
   // If the backend cannot continue on a single thread but will continue on all
   // threads, it should set the 'allThreadsContinued' attribute in the response
@@ -578,9 +501,6 @@
 // 'continue'. It is only necessary to send a 'continued' event if there was no
 // previous request that implied this.
 struct ContinuedEvent : public Event {
-  ContinuedEvent();
-  ~ContinuedEvent();
-
   // If 'allThreadsContinued' is true, a debug adapter can announce that all
   // threads have continued.
   optional<boolean> allThreadsContinued;
@@ -591,18 +511,12 @@
 DAP_DECLARE_STRUCT_TYPEINFO(ContinuedEvent);
 
 // This enumeration defines all possible access types for data breakpoints.
-struct DataBreakpointAccessType {
-  DataBreakpointAccessType();
-  ~DataBreakpointAccessType();
-};
+struct DataBreakpointAccessType {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(DataBreakpointAccessType);
 
 // Response to 'dataBreakpointInfo' request.
 struct DataBreakpointInfoResponse : public Response {
-  DataBreakpointInfoResponse();
-  ~DataBreakpointInfoResponse();
-
   // Optional attribute listing the available access types for a potential data
   // breakpoint. A UI frontend could surface this information.
   optional<array<DataBreakpointAccessType>> accessTypes;
@@ -625,10 +539,6 @@
 // capability 'supportsDataBreakpoints' is true.
 struct DataBreakpointInfoRequest : public Request {
   using Response = DataBreakpointInfoResponse;
-
-  DataBreakpointInfoRequest();
-  ~DataBreakpointInfoRequest();
-
   // The name of the Variable's child to obtain data breakpoint information for.
   // If variableReference isn’t provided, this can be an expression.
   string name;
@@ -641,9 +551,6 @@
 
 // Represents a single disassembled instruction.
 struct DisassembledInstruction {
-  DisassembledInstruction();
-  ~DisassembledInstruction();
-
   // The address of the instruction. Treated as a hex value if prefixed with
   // '0x', or as a decimal value otherwise.
   string address;
@@ -676,9 +583,6 @@
 
 // Response to 'disassemble' request.
 struct DisassembleResponse : public Response {
-  DisassembleResponse();
-  ~DisassembleResponse();
-
   // The list of disassembled instructions.
   array<DisassembledInstruction> instructions;
 };
@@ -690,10 +594,6 @@
 // 'supportsDisassembleRequest' is true.
 struct DisassembleRequest : public Request {
   using Response = DisassembleResponse;
-
-  DisassembleRequest();
-  ~DisassembleRequest();
-
   // Number of instructions to disassemble starting at the specified location
   // and offset. An adapter must return exactly this number of instructions -
   // any unavailable instructions should be replaced with an
@@ -717,10 +617,7 @@
 
 // Response to 'disconnect' request. This is just an acknowledgement, so no body
 // field is required.
-struct DisconnectResponse : public Response {
-  DisconnectResponse();
-  ~DisconnectResponse();
-};
+struct DisconnectResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(DisconnectResponse);
 
@@ -733,10 +630,6 @@
 // 'terminateDebuggee' argument (if supported by the debug adapter).
 struct DisconnectRequest : public Request {
   using Response = DisconnectResponse;
-
-  DisconnectRequest();
-  ~DisconnectRequest();
-
   // A value of true indicates that this 'disconnect' request is part of a
   // restart sequence.
   optional<boolean> restart;
@@ -751,9 +644,6 @@
 
 // A structured message object. Used to return errors from requests.
 struct Message {
-  Message();
-  ~Message();
-
   // A format string for the message. Embedded variables have the form '{name}'.
   // If variable name starts with an underscore character, the variable does not
   // contain user data (PII) and can be safely used for telemetry purposes.
@@ -779,9 +669,6 @@
 
 // On error (whenever 'success' is false), the body can provide more details.
 struct ErrorResponse : public Response {
-  ErrorResponse();
-  ~ErrorResponse();
-
   // An optional, structured error message.
   optional<Message> error;
 };
@@ -791,9 +678,6 @@
 // Optional properties of a variable that can be used to determine how to render
 // the variable in the UI.
 struct VariablePresentationHint {
-  VariablePresentationHint();
-  ~VariablePresentationHint();
-
   // Set of attributes represented as an array of strings. Before introducing
   // additional values, try to use the listed values.
   optional<array<string>> attributes;
@@ -816,9 +700,6 @@
 
 // Response to 'evaluate' request.
 struct EvaluateResponse : public Response {
-  EvaluateResponse();
-  ~EvaluateResponse();
-
   // The number of indexed child variables.
   // The client can use this optional information to present the variables in a
   // paged UI and fetch them in chunks. The value should be less than or equal
@@ -856,9 +737,6 @@
 
 // Provides formatting information for a value.
 struct ValueFormat {
-  ValueFormat();
-  ~ValueFormat();
-
   // Display the value in hex.
   optional<boolean> hex;
 };
@@ -869,10 +747,6 @@
 // The expression has access to any variables and arguments that are in scope.
 struct EvaluateRequest : public Request {
   using Response = EvaluateResponse;
-
-  EvaluateRequest();
-  ~EvaluateRequest();
-
   // The context in which the evaluate request is run.
   //
   // May be one of the following enumeration values:
@@ -895,18 +769,12 @@
 // should result in a break. never: never breaks, always: always breaks,
 // unhandled: breaks when exception unhandled,
 // userUnhandled: breaks if the exception is not handled by user code.
-struct ExceptionBreakMode {
-  ExceptionBreakMode();
-  ~ExceptionBreakMode();
-};
+struct ExceptionBreakMode {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(ExceptionBreakMode);
 
 // Detailed information about an exception that has occurred.
 struct ExceptionDetails {
-  ExceptionDetails();
-  ~ExceptionDetails();
-
   // Optional expression that can be evaluated in the current scope to obtain
   // the exception object.
   optional<string> evaluateName;
@@ -926,9 +794,6 @@
 
 // Response to 'exceptionInfo' request.
 struct ExceptionInfoResponse : public Response {
-  ExceptionInfoResponse();
-  ~ExceptionInfoResponse();
-
   // Mode that caused the exception notification to be raised.
   ExceptionBreakMode breakMode;
   // Descriptive text for the exception provided by the debug adapter.
@@ -946,10 +811,6 @@
 // 'supportsExceptionInfoRequest' is true.
 struct ExceptionInfoRequest : public Request {
   using Response = ExceptionInfoResponse;
-
-  ExceptionInfoRequest();
-  ~ExceptionInfoRequest();
-
   // Thread for which exception information should be retrieved.
   integer threadId;
 };
@@ -958,9 +819,6 @@
 
 // The event indicates that the debuggee has exited and returns its exit code.
 struct ExitedEvent : public Event {
-  ExitedEvent();
-  ~ExitedEvent();
-
   // The exit code returned from the debuggee.
   integer exitCode;
 };
@@ -969,10 +827,7 @@
 
 // Response to 'goto' request. This is just an acknowledgement, so no body field
 // is required.
-struct GotoResponse : public Response {
-  GotoResponse();
-  ~GotoResponse();
-};
+struct GotoResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(GotoResponse);
 
@@ -985,10 +840,6 @@
 // targets exist that can be passed as arguments).
 struct GotoRequest : public Request {
   using Response = GotoResponse;
-
-  GotoRequest();
-  ~GotoRequest();
-
   // The location where the debuggee will continue to run.
   integer targetId;
   // Set the goto target for this thread.
@@ -1001,9 +852,6 @@
 // 'goto' request. The possible goto targets can be determined via the
 // 'gotoTargets' request.
 struct GotoTarget {
-  GotoTarget();
-  ~GotoTarget();
-
   // An optional column of the goto target.
   optional<integer> column;
   // An optional end column of the range covered by the goto target.
@@ -1025,9 +873,6 @@
 
 // Response to 'gotoTargets' request.
 struct GotoTargetsResponse : public Response {
-  GotoTargetsResponse();
-  ~GotoTargetsResponse();
-
   // The possible goto targets of the specified location.
   array<GotoTarget> targets;
 };
@@ -1040,10 +885,6 @@
 // true.
 struct GotoTargetsRequest : public Request {
   using Response = GotoTargetsResponse;
-
-  GotoTargetsRequest();
-  ~GotoTargetsRequest();
-
   // An optional column location for which the goto targets are determined.
   optional<integer> column;
   // The line location for which the goto targets are determined.
@@ -1056,9 +897,6 @@
 
 // Response to 'initialize' request.
 struct InitializeResponse : public Response {
-  InitializeResponse();
-  ~InitializeResponse();
-
   // The set of additional module information exposed by the debug adapter.
   optional<array<ColumnDescriptor>> additionalModuleColumns;
   // The set of characters that should trigger completion in a REPL. If not
@@ -1158,10 +996,6 @@
 // only be sent once.
 struct InitializeRequest : public Request {
   using Response = InitializeResponse;
-
-  InitializeRequest();
-  ~InitializeRequest();
-
   // The ID of the debug adapter.
   string adapterID;
   // The ID of the (frontend) client using this adapter.
@@ -1211,19 +1045,13 @@
 // - frontend sends other future configuration requests
 // - frontend sends one 'configurationDone' request to indicate the end of the
 // configuration.
-struct InitializedEvent : public Event {
-  InitializedEvent();
-  ~InitializedEvent();
-};
+struct InitializedEvent : public Event {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(InitializedEvent);
 
 // Response to 'launch' request. This is just an acknowledgement, so no body
 // field is required.
-struct LaunchResponse : public Response {
-  LaunchResponse();
-  ~LaunchResponse();
-};
+struct LaunchResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(LaunchResponse);
 
@@ -1233,10 +1061,6 @@
 // this specification.
 struct LaunchRequest : public Request {
   using Response = LaunchResponse;
-
-  LaunchRequest();
-  ~LaunchRequest();
-
   // Optional data from the previous, restarted session.
   // The data is sent as the 'restart' attribute of the 'terminated' event.
   // The client should leave the data intact.
@@ -1252,9 +1076,6 @@
 // The event indicates that some source has been added, changed, or removed from
 // the set of all loaded sources.
 struct LoadedSourceEvent : public Event {
-  LoadedSourceEvent();
-  ~LoadedSourceEvent();
-
   // The reason for the event.
   //
   // Must be one of the following enumeration values:
@@ -1268,9 +1089,6 @@
 
 // Response to 'loadedSources' request.
 struct LoadedSourcesResponse : public Response {
-  LoadedSourcesResponse();
-  ~LoadedSourcesResponse();
-
   // Set of loaded sources.
   array<Source> sources;
 };
@@ -1282,9 +1100,6 @@
 // 'supportsLoadedSourcesRequest' is true.
 struct LoadedSourcesRequest : public Request {
   using Response = LoadedSourcesResponse;
-
-  LoadedSourcesRequest();
-  ~LoadedSourcesRequest();
 };
 
 DAP_DECLARE_STRUCT_TYPEINFO(LoadedSourcesRequest);
@@ -1302,9 +1117,6 @@
 // 'recommended' list below first, and only introduce new attributes if nothing
 // appropriate could be found.
 struct Module {
-  Module();
-  ~Module();
-
   // Address range covered by this module.
   optional<string> addressRange;
   // Module created or modified.
@@ -1339,9 +1151,6 @@
 
 // The event indicates that some information about a module has changed.
 struct ModuleEvent : public Event {
-  ModuleEvent();
-  ~ModuleEvent();
-
   // The new, changed, or removed module. In case of 'removed' only the module
   // id is used.
   Module module;
@@ -1356,9 +1165,6 @@
 
 // Response to 'modules' request.
 struct ModulesResponse : public Response {
-  ModulesResponse();
-  ~ModulesResponse();
-
   // All modules or range of modules.
   array<Module> modules;
   // The total number of modules available.
@@ -1373,10 +1179,6 @@
 // true.
 struct ModulesRequest : public Request {
   using Response = ModulesResponse;
-
-  ModulesRequest();
-  ~ModulesRequest();
-
   // The number of modules to return. If moduleCount is not specified or 0, all
   // modules are returned.
   optional<integer> moduleCount;
@@ -1388,19 +1190,13 @@
 
 // Response to 'next' request. This is just an acknowledgement, so no body field
 // is required.
-struct NextResponse : public Response {
-  NextResponse();
-  ~NextResponse();
-};
+struct NextResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(NextResponse);
 
 // The granularity of one 'step' in the stepping requests 'next', 'stepIn',
 // 'stepOut', and 'stepBack'.
-struct SteppingGranularity {
-  SteppingGranularity();
-  ~SteppingGranularity();
-};
+struct SteppingGranularity {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(SteppingGranularity);
 
@@ -1409,10 +1205,6 @@
 // reason 'step') after the step has completed.
 struct NextRequest : public Request {
   using Response = NextResponse;
-
-  NextRequest();
-  ~NextRequest();
-
   // Optional granularity to step. If no granularity is specified, a granularity
   // of 'statement' is assumed.
   optional<SteppingGranularity> granularity;
@@ -1424,9 +1216,6 @@
 
 // The event indicates that the target has produced some output.
 struct OutputEvent : public Event {
-  OutputEvent();
-  ~OutputEvent();
-
   // The output category. If not specified, 'console' is assumed.
   //
   // May be one of the following enumeration values:
@@ -1460,10 +1249,7 @@
 
 // Response to 'pause' request. This is just an acknowledgement, so no body
 // field is required.
-struct PauseResponse : public Response {
-  PauseResponse();
-  ~PauseResponse();
-};
+struct PauseResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(PauseResponse);
 
@@ -1472,10 +1258,6 @@
 // reason 'pause') after the thread has been paused successfully.
 struct PauseRequest : public Request {
   using Response = PauseResponse;
-
-  PauseRequest();
-  ~PauseRequest();
-
   // Pause execution for this thread.
   integer threadId;
 };
@@ -1485,9 +1267,6 @@
 // The event indicates that the debugger has begun debugging a new process.
 // Either one that it has launched, or one that it has attached to.
 struct ProcessEvent : public Event {
-  ProcessEvent();
-  ~ProcessEvent();
-
   // If true, the process is running on the same computer as the debug adapter.
   optional<boolean> isLocalProcess;
   // The logical name of the process. This is usually the full path to process's
@@ -1513,9 +1292,6 @@
 // true for the 'supportsProgressReporting' capability of the 'initialize'
 // request.
 struct ProgressEndEvent : public Event {
-  ProgressEndEvent();
-  ~ProgressEndEvent();
-
   // Optional, more detailed progress message. If omitted, the previous message
   // (if any) is used.
   optional<string> message;
@@ -1532,9 +1308,6 @@
 // has passed the value true for the 'supportsProgressReporting' capability of
 // the 'initialize' request.
 struct ProgressStartEvent : public Event {
-  ProgressStartEvent();
-  ~ProgressStartEvent();
-
   // If true, the request that reports progress may be canceled with a 'cancel'
   // request. So this property basically controls whether the client should use
   // UX that supports cancellation. Clients that don't support cancellation are
@@ -1569,9 +1342,6 @@
 // the value true for the 'supportsProgressReporting' capability of the
 // 'initialize' request.
 struct ProgressUpdateEvent : public Event {
-  ProgressUpdateEvent();
-  ~ProgressUpdateEvent();
-
   // Optional, more detailed progress message. If omitted, the previous message
   // (if any) is used.
   optional<string> message;
@@ -1586,9 +1356,6 @@
 
 // Response to 'readMemory' request.
 struct ReadMemoryResponse : public Response {
-  ReadMemoryResponse();
-  ~ReadMemoryResponse();
-
   // The address of the first byte of data returned.
   // Treated as a hex value if prefixed with '0x', or as a decimal value
   // otherwise.
@@ -1608,10 +1375,6 @@
 // 'supportsReadMemoryRequest' is true.
 struct ReadMemoryRequest : public Request {
   using Response = ReadMemoryResponse;
-
-  ReadMemoryRequest();
-  ~ReadMemoryRequest();
-
   // Number of bytes to read at the specified location and offset.
   integer count;
   // Memory reference to the base location from which data should be read.
@@ -1625,10 +1388,7 @@
 
 // Response to 'restartFrame' request. This is just an acknowledgement, so no
 // body field is required.
-struct RestartFrameResponse : public Response {
-  RestartFrameResponse();
-  ~RestartFrameResponse();
-};
+struct RestartFrameResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(RestartFrameResponse);
 
@@ -1638,10 +1398,6 @@
 // this request if the capability 'supportsRestartFrame' is true.
 struct RestartFrameRequest : public Request {
   using Response = RestartFrameResponse;
-
-  RestartFrameRequest();
-  ~RestartFrameRequest();
-
   // Restart this stackframe.
   integer frameId;
 };
@@ -1650,10 +1406,7 @@
 
 // Response to 'restart' request. This is just an acknowledgement, so no body
 // field is required.
-struct RestartResponse : public Response {
-  RestartResponse();
-  ~RestartResponse();
-};
+struct RestartResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(RestartResponse);
 
@@ -1663,19 +1416,13 @@
 // the debug adapter first and then launching it anew.
 struct RestartRequest : public Request {
   using Response = RestartResponse;
-
-  RestartRequest();
-  ~RestartRequest();
 };
 
 DAP_DECLARE_STRUCT_TYPEINFO(RestartRequest);
 
 // Response to 'reverseContinue' request. This is just an acknowledgement, so no
 // body field is required.
-struct ReverseContinueResponse : public Response {
-  ReverseContinueResponse();
-  ~ReverseContinueResponse();
-};
+struct ReverseContinueResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(ReverseContinueResponse);
 
@@ -1684,10 +1431,6 @@
 // true.
 struct ReverseContinueRequest : public Request {
   using Response = ReverseContinueResponse;
-
-  ReverseContinueRequest();
-  ~ReverseContinueRequest();
-
   // Execute 'reverseContinue' for this thread.
   integer threadId;
 };
@@ -1696,9 +1439,6 @@
 
 // Response to 'runInTerminal' request.
 struct RunInTerminalResponse : public Response {
-  RunInTerminalResponse();
-  ~RunInTerminalResponse();
-
   // The process ID. The value should be less than or equal to 2147483647 (2^31
   // - 1).
   optional<integer> processId;
@@ -1716,10 +1456,6 @@
 // capability of the 'initialize' request.
 struct RunInTerminalRequest : public Request {
   using Response = RunInTerminalResponse;
-
-  RunInTerminalRequest();
-  ~RunInTerminalRequest();
-
   // List of arguments. The first argument is the command to run.
   array<string> args;
   // Working directory of the command.
@@ -1741,9 +1477,6 @@
 // A Scope is a named container for variables. Optionally a scope can map to a
 // source or a range within a source.
 struct Scope {
-  Scope();
-  ~Scope();
-
   // Optional start column of the range covered by this scope.
   optional<integer> column;
   // Optional end column of the range covered by this scope.
@@ -1783,9 +1516,6 @@
 
 // Response to 'scopes' request.
 struct ScopesResponse : public Response {
-  ScopesResponse();
-  ~ScopesResponse();
-
   // The scopes of the stackframe. If the array has length zero, there are no
   // scopes available.
   array<Scope> scopes;
@@ -1796,10 +1526,6 @@
 // The request returns the variable scopes for a given stackframe ID.
 struct ScopesRequest : public Request {
   using Response = ScopesResponse;
-
-  ScopesRequest();
-  ~ScopesRequest();
-
   // Retrieve the scopes for this stackframe.
   integer frameId;
 };
@@ -1812,9 +1538,6 @@
 // verified. The breakpoints returned are in the same order as the elements of
 // the 'breakpoints' (or the deprecated 'lines') array in the arguments.
 struct SetBreakpointsResponse : public Response {
-  SetBreakpointsResponse();
-  ~SetBreakpointsResponse();
-
   // Information about the breakpoints.
   // The array elements are in the same order as the elements of the
   // 'breakpoints' (or the deprecated 'lines') array in the arguments.
@@ -1825,9 +1548,6 @@
 
 // Properties of a breakpoint or logpoint passed to the setBreakpoints request.
 struct SourceBreakpoint {
-  SourceBreakpoint();
-  ~SourceBreakpoint();
-
   // An optional source column of the breakpoint.
   optional<integer> column;
   // An optional expression for conditional breakpoints.
@@ -1856,10 +1576,6 @@
 // 'breakpoint') is generated.
 struct SetBreakpointsRequest : public Request {
   using Response = SetBreakpointsResponse;
-
-  SetBreakpointsRequest();
-  ~SetBreakpointsRequest();
-
   // The code locations of the breakpoints.
   optional<array<SourceBreakpoint>> breakpoints;
   // Deprecated: The code locations of the breakpoints.
@@ -1877,9 +1593,6 @@
 // Response to 'setDataBreakpoints' request.
 // Returned is information about each breakpoint created by this request.
 struct SetDataBreakpointsResponse : public Response {
-  SetDataBreakpointsResponse();
-  ~SetDataBreakpointsResponse();
-
   // Information about the data breakpoints. The array elements correspond to
   // the elements of the input argument 'breakpoints' array.
   array<Breakpoint> breakpoints;
@@ -1889,9 +1602,6 @@
 
 // Properties of a data breakpoint passed to the setDataBreakpoints request.
 struct DataBreakpoint {
-  DataBreakpoint();
-  ~DataBreakpoint();
-
   // The access type of the data.
   optional<DataBreakpointAccessType> accessType;
   // An optional expression for conditional breakpoints.
@@ -1913,10 +1623,6 @@
 // capability 'supportsDataBreakpoints' is true.
 struct SetDataBreakpointsRequest : public Request {
   using Response = SetDataBreakpointsResponse;
-
-  SetDataBreakpointsRequest();
-  ~SetDataBreakpointsRequest();
-
   // The contents of this array replaces all existing data breakpoints. An empty
   // array clears all data breakpoints.
   array<DataBreakpoint> breakpoints;
@@ -1926,10 +1632,7 @@
 
 // Response to 'setExceptionBreakpoints' request. This is just an
 // acknowledgement, so no body field is required.
-struct SetExceptionBreakpointsResponse : public Response {
-  SetExceptionBreakpointsResponse();
-  ~SetExceptionBreakpointsResponse();
-};
+struct SetExceptionBreakpointsResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(SetExceptionBreakpointsResponse);
 
@@ -1938,9 +1641,6 @@
 // one name, it matches the names provided if 'negate' is false or missing or it
 // matches anything except the names provided if 'negate' is true.
 struct ExceptionPathSegment {
-  ExceptionPathSegment();
-  ~ExceptionPathSegment();
-
   // Depending on the value of 'negate' the names that should match or not
   // match.
   array<string> names;
@@ -1953,9 +1653,6 @@
 
 // An ExceptionOptions assigns configuration options to a set of exceptions.
 struct ExceptionOptions {
-  ExceptionOptions();
-  ~ExceptionOptions();
-
   // Condition when a thrown exception should result in a break.
   ExceptionBreakMode breakMode;
   // A path that selects a single or multiple exceptions in a tree. If 'path' is
@@ -1972,10 +1669,6 @@
 // 'exceptionBreakpointFilters' returns one or more filters.
 struct SetExceptionBreakpointsRequest : public Request {
   using Response = SetExceptionBreakpointsResponse;
-
-  SetExceptionBreakpointsRequest();
-  ~SetExceptionBreakpointsRequest();
-
   // Configuration options for selected exceptions.
   // The attribute is only honored by a debug adapter if the capability
   // 'supportsExceptionOptions' is true.
@@ -1989,9 +1682,6 @@
 
 // Response to 'setExpression' request.
 struct SetExpressionResponse : public Response {
-  SetExpressionResponse();
-  ~SetExpressionResponse();
-
   // The number of indexed child variables.
   // The client can use this optional information to present the variables in a
   // paged UI and fetch them in chunks. The value should be less than or equal
@@ -2027,10 +1717,6 @@
 // true.
 struct SetExpressionRequest : public Request {
   using Response = SetExpressionResponse;
-
-  SetExpressionRequest();
-  ~SetExpressionRequest();
-
   // The l-value expression to assign to.
   string expression;
   // Specifies how the resulting value should be formatted.
@@ -2047,9 +1733,6 @@
 // Response to 'setFunctionBreakpoints' request.
 // Returned is information about each breakpoint created by this request.
 struct SetFunctionBreakpointsResponse : public Response {
-  SetFunctionBreakpointsResponse();
-  ~SetFunctionBreakpointsResponse();
-
   // Information about the breakpoints. The array elements correspond to the
   // elements of the 'breakpoints' array.
   array<Breakpoint> breakpoints;
@@ -2059,9 +1742,6 @@
 
 // Properties of a breakpoint passed to the setFunctionBreakpoints request.
 struct FunctionBreakpoint {
-  FunctionBreakpoint();
-  ~FunctionBreakpoint();
-
   // An optional expression for conditional breakpoints.
   // It is only honored by a debug adapter if the capability
   // 'supportsConditionalBreakpoints' is true.
@@ -2084,10 +1764,6 @@
 // capability 'supportsFunctionBreakpoints' is true.
 struct SetFunctionBreakpointsRequest : public Request {
   using Response = SetFunctionBreakpointsResponse;
-
-  SetFunctionBreakpointsRequest();
-  ~SetFunctionBreakpointsRequest();
-
   // The function names of the breakpoints.
   array<FunctionBreakpoint> breakpoints;
 };
@@ -2096,9 +1772,6 @@
 
 // Response to 'setInstructionBreakpoints' request
 struct SetInstructionBreakpointsResponse : public Response {
-  SetInstructionBreakpointsResponse();
-  ~SetInstructionBreakpointsResponse();
-
   // Information about the breakpoints. The array elements correspond to the
   // elements of the 'breakpoints' array.
   array<Breakpoint> breakpoints;
@@ -2108,9 +1781,6 @@
 
 // Properties of a breakpoint passed to the setInstructionBreakpoints request
 struct InstructionBreakpoint {
-  InstructionBreakpoint();
-  ~InstructionBreakpoint();
-
   // An optional expression for conditional breakpoints.
   // It is only honored by a debug adapter if the capability
   // 'supportsConditionalBreakpoints' is true.
@@ -2139,10 +1809,6 @@
 // 'supportsInstructionBreakpoints' is true.
 struct SetInstructionBreakpointsRequest : public Request {
   using Response = SetInstructionBreakpointsResponse;
-
-  SetInstructionBreakpointsRequest();
-  ~SetInstructionBreakpointsRequest();
-
   // The instruction references of the breakpoints
   array<InstructionBreakpoint> breakpoints;
 };
@@ -2151,9 +1817,6 @@
 
 // Response to 'setVariable' request.
 struct SetVariableResponse : public Response {
-  SetVariableResponse();
-  ~SetVariableResponse();
-
   // The number of indexed child variables.
   // The client can use this optional information to present the variables in a
   // paged UI and fetch them in chunks. The value should be less than or equal
@@ -2182,10 +1845,6 @@
 // 'supportsSetVariable' is true.
 struct SetVariableRequest : public Request {
   using Response = SetVariableResponse;
-
-  SetVariableRequest();
-  ~SetVariableRequest();
-
   // Specifies details on how to format the response value.
   optional<ValueFormat> format;
   // The name of the variable in the container.
@@ -2200,9 +1859,6 @@
 
 // Response to 'source' request.
 struct SourceResponse : public Response {
-  SourceResponse();
-  ~SourceResponse();
-
   // Content of the source reference.
   string content;
   // Optional content type (mime type) of the source.
@@ -2214,10 +1870,6 @@
 // The request retrieves the source code for a given source reference.
 struct SourceRequest : public Request {
   using Response = SourceResponse;
-
-  SourceRequest();
-  ~SourceRequest();
-
   // Specifies the source content to load. Either source.path or
   // source.sourceReference must be specified.
   optional<Source> source;
@@ -2231,9 +1883,6 @@
 
 // A Stackframe contains the source location.
 struct StackFrame {
-  StackFrame();
-  ~StackFrame();
-
   // The column within the line. If source is null or doesn't exist, column is 0
   // and must be ignored.
   integer column;
@@ -2271,9 +1920,6 @@
 
 // Response to 'stackTrace' request.
 struct StackTraceResponse : public Response {
-  StackTraceResponse();
-  ~StackTraceResponse();
-
   // The frames of the stackframe. If the array has length zero, there are no
   // stackframes available. This means that there is no location information
   // available.
@@ -2286,9 +1932,6 @@
 
 // Provides formatting information for a stack frame.
 struct StackFrameFormat : public ValueFormat {
-  StackFrameFormat();
-  ~StackFrameFormat();
-
   // Includes all stack frames, including those the debug adapter might
   // otherwise hide.
   optional<boolean> includeAll;
@@ -2311,10 +1954,6 @@
 // The request returns a stacktrace from the current execution state.
 struct StackTraceRequest : public Request {
   using Response = StackTraceResponse;
-
-  StackTraceRequest();
-  ~StackTraceRequest();
-
   // Specifies details on how to format the stack frames.
   // The attribute is only honored by a debug adapter if the capability
   // 'supportsValueFormattingOptions' is true.
@@ -2332,10 +1971,7 @@
 
 // Response to 'stepBack' request. This is just an acknowledgement, so no body
 // field is required.
-struct StepBackResponse : public Response {
-  StepBackResponse();
-  ~StepBackResponse();
-};
+struct StepBackResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(StepBackResponse);
 
@@ -2345,10 +1981,6 @@
 // request if the capability 'supportsStepBack' is true.
 struct StepBackRequest : public Request {
   using Response = StepBackResponse;
-
-  StepBackRequest();
-  ~StepBackRequest();
-
   // Optional granularity to step. If no granularity is specified, a granularity
   // of 'statement' is assumed.
   optional<SteppingGranularity> granularity;
@@ -2360,10 +1992,7 @@
 
 // Response to 'stepIn' request. This is just an acknowledgement, so no body
 // field is required.
-struct StepInResponse : public Response {
-  StepInResponse();
-  ~StepInResponse();
-};
+struct StepInResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(StepInResponse);
 
@@ -2377,10 +2006,6 @@
 // retrieved via the 'stepInTargets' request.
 struct StepInRequest : public Request {
   using Response = StepInResponse;
-
-  StepInRequest();
-  ~StepInRequest();
-
   // Optional granularity to step. If no granularity is specified, a granularity
   // of 'statement' is assumed.
   optional<SteppingGranularity> granularity;
@@ -2395,9 +2020,6 @@
 // A StepInTarget can be used in the 'stepIn' request and determines into which
 // single target the stepIn request should step.
 struct StepInTarget {
-  StepInTarget();
-  ~StepInTarget();
-
   // Unique identifier for a stepIn target.
   integer id;
   // The name of the stepIn target (shown in the UI).
@@ -2408,9 +2030,6 @@
 
 // Response to 'stepInTargets' request.
 struct StepInTargetsResponse : public Response {
-  StepInTargetsResponse();
-  ~StepInTargetsResponse();
-
   // The possible stepIn targets of the specified source location.
   array<StepInTarget> targets;
 };
@@ -2424,10 +2043,6 @@
 // 'supportsStepInTargetsRequest' is true.
 struct StepInTargetsRequest : public Request {
   using Response = StepInTargetsResponse;
-
-  StepInTargetsRequest();
-  ~StepInTargetsRequest();
-
   // The stack frame for which to retrieve the possible stepIn targets.
   integer frameId;
 };
@@ -2436,10 +2051,7 @@
 
 // Response to 'stepOut' request. This is just an acknowledgement, so no body
 // field is required.
-struct StepOutResponse : public Response {
-  StepOutResponse();
-  ~StepOutResponse();
-};
+struct StepOutResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(StepOutResponse);
 
@@ -2448,10 +2060,6 @@
 // reason 'step') after the step has completed.
 struct StepOutRequest : public Request {
   using Response = StepOutResponse;
-
-  StepOutRequest();
-  ~StepOutRequest();
-
   // Optional granularity to step. If no granularity is specified, a granularity
   // of 'statement' is assumed.
   optional<SteppingGranularity> granularity;
@@ -2465,9 +2073,6 @@
 // some condition. This can be caused by a break point previously set, a
 // stepping request has completed, by executing a debugger statement etc.
 struct StoppedEvent : public Event {
-  StoppedEvent();
-  ~StoppedEvent();
-
   // If 'allThreadsStopped' is true, a debug adapter can announce that all
   // threads have stopped.
   // - The client should use this information to enable that all threads can be
@@ -2500,10 +2105,7 @@
 
 // Response to 'terminate' request. This is just an acknowledgement, so no body
 // field is required.
-struct TerminateResponse : public Response {
-  TerminateResponse();
-  ~TerminateResponse();
-};
+struct TerminateResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(TerminateResponse);
 
@@ -2512,10 +2114,6 @@
 // call this request if the capability 'supportsTerminateRequest' is true.
 struct TerminateRequest : public Request {
   using Response = TerminateResponse;
-
-  TerminateRequest();
-  ~TerminateRequest();
-
   // A value of true indicates that this 'terminate' request is part of a
   // restart sequence.
   optional<boolean> restart;
@@ -2525,10 +2123,7 @@
 
 // Response to 'terminateThreads' request. This is just an acknowledgement, so
 // no body field is required.
-struct TerminateThreadsResponse : public Response {
-  TerminateThreadsResponse();
-  ~TerminateThreadsResponse();
-};
+struct TerminateThreadsResponse : public Response {};
 
 DAP_DECLARE_STRUCT_TYPEINFO(TerminateThreadsResponse);
 
@@ -2537,10 +2132,6 @@
 // 'supportsTerminateThreadsRequest' is true.
 struct TerminateThreadsRequest : public Request {
   using Response = TerminateThreadsResponse;
-
-  TerminateThreadsRequest();
-  ~TerminateThreadsRequest();
-
   // Ids of threads to be terminated.
   optional<array<integer>> threadIds;
 };
@@ -2550,9 +2141,6 @@
 // The event indicates that debugging of the debuggee has terminated. This does
 // **not** mean that the debuggee itself has exited.
 struct TerminatedEvent : public Event {
-  TerminatedEvent();
-  ~TerminatedEvent();
-
   // A debug adapter may set 'restart' to true (or to an arbitrary object) to
   // request that the front end restarts the session. The value is not
   // interpreted by the client and passed unmodified as an attribute '__restart'
@@ -2565,9 +2153,6 @@
 
 // The event indicates that a thread has started or exited.
 struct ThreadEvent : public Event {
-  ThreadEvent();
-  ~ThreadEvent();
-
   // The reason for the event.
   //
   // May be one of the following enumeration values:
@@ -2581,9 +2166,6 @@
 
 // A Thread
 struct Thread {
-  Thread();
-  ~Thread();
-
   // Unique identifier for the thread.
   integer id;
   // A name of the thread.
@@ -2594,9 +2176,6 @@
 
 // Response to 'threads' request.
 struct ThreadsResponse : public Response {
-  ThreadsResponse();
-  ~ThreadsResponse();
-
   // All threads.
   array<Thread> threads;
 };
@@ -2606,9 +2185,6 @@
 // The request retrieves a list of all threads.
 struct ThreadsRequest : public Request {
   using Response = ThreadsResponse;
-
-  ThreadsRequest();
-  ~ThreadsRequest();
 };
 
 DAP_DECLARE_STRUCT_TYPEINFO(ThreadsRequest);
@@ -2624,9 +2200,6 @@
 // 'indexedVariables' attributes. The client can use this optional information
 // to present the children in a paged UI and fetch them in chunks.
 struct Variable {
-  Variable();
-  ~Variable();
-
   // Optional evaluatable name of this variable which can be passed to the
   // 'EvaluateRequest' to fetch the variable's value.
   optional<string> evaluateName;
@@ -2665,9 +2238,6 @@
 
 // Response to 'variables' request.
 struct VariablesResponse : public Response {
-  VariablesResponse();
-  ~VariablesResponse();
-
   // All (or a range) of variables for the given variable reference.
   array<Variable> variables;
 };
@@ -2679,10 +2249,6 @@
 // or indexed children.
 struct VariablesRequest : public Request {
   using Response = VariablesResponse;
-
-  VariablesRequest();
-  ~VariablesRequest();
-
   // The number of variables to return. If count is missing or 0, all variables
   // are returned.
   optional<integer> count;
diff --git a/include/dap/serialization.h b/include/dap/serialization.h
index 998cb37..ee4fd87 100644
--- a/include/dap/serialization.h
+++ b/include/dap/serialization.h
@@ -38,6 +38,8 @@
 // Methods that return a bool use this to indicate success.
 class Deserializer {
  public:
+  virtual ~Deserializer() = default;
+
   // deserialization methods for simple data types.
   // If the stored object is not of the correct type, then these function will
   // return false.
@@ -104,7 +106,7 @@
   T v;
   if (deserialize(&v)) {
     *opt = v;
-  };
+  }
   return true;
 }
 
@@ -132,6 +134,8 @@
 // Methods that return a bool use this to indicate success.
 class Serializer {
  public:
+  virtual ~Serializer() = default;
+
   // serialization methods for simple data types.
   virtual bool serialize(boolean) = 0;
   virtual bool serialize(integer) = 0;
@@ -215,6 +219,8 @@
   template <typename T>
   using IsSerializeFunc = std::is_convertible<T, SerializeFunc>;
 
+  virtual ~FieldSerializer() = default;
+
   // field() encodes a field to the struct object referenced by this Serializer.
   // The SerializeFunc will be called with a Serializer used to encode the
   // field's data.
diff --git a/include/dap/session.h b/include/dap/session.h
index da05feb..52be9f2 100644
--- a/include/dap/session.h
+++ b/include/dap/session.h
@@ -98,14 +98,13 @@
 };
 
 template <typename T>
-ResponseOrError<T>::ResponseOrError(const T& response) : response(response) {}
+ResponseOrError<T>::ResponseOrError(const T& resp) : response(resp) {}
 template <typename T>
-ResponseOrError<T>::ResponseOrError(T&& response)
-    : response(std::move(response)) {}
+ResponseOrError<T>::ResponseOrError(T&& resp) : response(std::move(resp)) {}
 template <typename T>
-ResponseOrError<T>::ResponseOrError(const Error& error) : error(error) {}
+ResponseOrError<T>::ResponseOrError(const Error& err) : error(err) {}
 template <typename T>
-ResponseOrError<T>::ResponseOrError(Error&& error) : error(std::move(error)) {}
+ResponseOrError<T>::ResponseOrError(Error&& err) : error(std::move(err)) {}
 template <typename T>
 ResponseOrError<T>::ResponseOrError(const ResponseOrError& other)
     : response(other.response), error(other.error) {}
@@ -148,7 +147,7 @@
   using ArgTy = typename detail::ArgTy<F>::type;
 
  public:
-  virtual ~Session() = default;
+  virtual ~Session();
 
   // ErrorHandler is the type of callback function used for reporting protocol
   // errors.
diff --git a/include/dap/typeinfo.h b/include/dap/typeinfo.h
index fbef4e8..11f1f12 100644
--- a/include/dap/typeinfo.h
+++ b/include/dap/typeinfo.h
@@ -28,6 +28,7 @@
 // types. TypeInfo is used by the serialization system to encode and decode DAP
 // requests, responses, events and structs.
 struct TypeInfo {
+  virtual ~TypeInfo();
   virtual std::string name() const = 0;
   virtual size_t size() const = 0;
   virtual size_t alignment() const = 0;
diff --git a/include/dap/typeof.h b/include/dap/typeof.h
index e682ab5..ba2b045 100644
--- a/include/dap/typeof.h
+++ b/include/dap/typeof.h
@@ -26,7 +26,7 @@
 // template type T.
 template <typename T>
 struct BasicTypeInfo : public TypeInfo {
-  BasicTypeInfo(const std::string& name) : name_(name) {}
+  constexpr BasicTypeInfo(std::string&& name) : name_(std::move(name)) {}
 
   // TypeInfo compliance
   inline std::string name() const { return name_; }
@@ -88,6 +88,15 @@
   static const TypeInfo* type();
 };
 
+// TypeOf for template types requires dynamic generation of type information,
+// triggering the clang -Wexit-time-destructors warning.
+// TODO(bclayton): See if there's a way to avoid this, without requiring manual
+// instantiation of each type.
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wexit-time-destructors"
+#endif  // __clang__
+
 template <typename T>
 struct TypeOf<array<T>> {
   static inline const TypeInfo* type() {
@@ -114,6 +123,10 @@
   }
 };
 
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif  // __clang__
+
 // DAP_OFFSETOF() macro is a generalization of the offsetof() macro defined in
 // <cstddef>. It evaluates to the offset of the given field, with fewer
 // restrictions than offsetof(). We cast the address '32' and subtract it again,
diff --git a/include/dap/variant.h b/include/dap/variant.h
index 637787c..96e57c2 100644
--- a/include/dap/variant.h
+++ b/include/dap/variant.h
@@ -72,7 +72,7 @@
 
 template <typename T0, typename... Types>
 template <typename T>
-variant<T0, Types...>::variant(const T& value) : value(value) {
+variant<T0, Types...>::variant(const T& v) : value(v) {
   static_assert(accepts<T>(), "variant does not accept template type T");
 }
 
diff --git a/src/protocol_events.cpp b/src/protocol_events.cpp
index d5dc01b..5be9e9f 100644
--- a/src/protocol_events.cpp
+++ b/src/protocol_events.cpp
@@ -21,53 +21,37 @@
 
 namespace dap {
 
-BreakpointEvent::BreakpointEvent() = default;
-BreakpointEvent::~BreakpointEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(BreakpointEvent,
                               "breakpoint",
                               DAP_FIELD(breakpoint, "breakpoint"),
                               DAP_FIELD(reason, "reason"));
 
-CapabilitiesEvent::CapabilitiesEvent() = default;
-CapabilitiesEvent::~CapabilitiesEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(CapabilitiesEvent,
                               "capabilities",
                               DAP_FIELD(capabilities, "capabilities"));
 
-ContinuedEvent::ContinuedEvent() = default;
-ContinuedEvent::~ContinuedEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ContinuedEvent,
                               "continued",
                               DAP_FIELD(allThreadsContinued,
                                         "allThreadsContinued"),
                               DAP_FIELD(threadId, "threadId"));
 
-ExitedEvent::ExitedEvent() = default;
-ExitedEvent::~ExitedEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ExitedEvent,
                               "exited",
                               DAP_FIELD(exitCode, "exitCode"));
 
-InitializedEvent::InitializedEvent() = default;
-InitializedEvent::~InitializedEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(InitializedEvent, "initialized");
 
-LoadedSourceEvent::LoadedSourceEvent() = default;
-LoadedSourceEvent::~LoadedSourceEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(LoadedSourceEvent,
                               "loadedSource",
                               DAP_FIELD(reason, "reason"),
                               DAP_FIELD(source, "source"));
 
-ModuleEvent::ModuleEvent() = default;
-ModuleEvent::~ModuleEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ModuleEvent,
                               "module",
                               DAP_FIELD(module, "module"),
                               DAP_FIELD(reason, "reason"));
 
-OutputEvent::OutputEvent() = default;
-OutputEvent::~OutputEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(OutputEvent,
                               "output",
                               DAP_FIELD(category, "category"),
@@ -80,8 +64,6 @@
                               DAP_FIELD(variablesReference,
                                         "variablesReference"));
 
-ProcessEvent::ProcessEvent() = default;
-ProcessEvent::~ProcessEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ProcessEvent,
                               "process",
                               DAP_FIELD(isLocalProcess, "isLocalProcess"),
@@ -90,15 +72,11 @@
                               DAP_FIELD(startMethod, "startMethod"),
                               DAP_FIELD(systemProcessId, "systemProcessId"));
 
-ProgressEndEvent::ProgressEndEvent() = default;
-ProgressEndEvent::~ProgressEndEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ProgressEndEvent,
                               "progressEnd",
                               DAP_FIELD(message, "message"),
                               DAP_FIELD(progressId, "progressId"));
 
-ProgressStartEvent::ProgressStartEvent() = default;
-ProgressStartEvent::~ProgressStartEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ProgressStartEvent,
                               "progressStart",
                               DAP_FIELD(cancellable, "cancellable"),
@@ -108,16 +86,12 @@
                               DAP_FIELD(requestId, "requestId"),
                               DAP_FIELD(title, "title"));
 
-ProgressUpdateEvent::ProgressUpdateEvent() = default;
-ProgressUpdateEvent::~ProgressUpdateEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ProgressUpdateEvent,
                               "progressUpdate",
                               DAP_FIELD(message, "message"),
                               DAP_FIELD(percentage, "percentage"),
                               DAP_FIELD(progressId, "progressId"));
 
-StoppedEvent::StoppedEvent() = default;
-StoppedEvent::~StoppedEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StoppedEvent,
                               "stopped",
                               DAP_FIELD(allThreadsStopped, "allThreadsStopped"),
@@ -127,14 +101,10 @@
                               DAP_FIELD(text, "text"),
                               DAP_FIELD(threadId, "threadId"));
 
-TerminatedEvent::TerminatedEvent() = default;
-TerminatedEvent::~TerminatedEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(TerminatedEvent,
                               "terminated",
                               DAP_FIELD(restart, "restart"));
 
-ThreadEvent::ThreadEvent() = default;
-ThreadEvent::~ThreadEvent() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ThreadEvent,
                               "thread",
                               DAP_FIELD(reason, "reason"),
diff --git a/src/protocol_requests.cpp b/src/protocol_requests.cpp
index 7ae4cd8..bdfb7c3 100644
--- a/src/protocol_requests.cpp
+++ b/src/protocol_requests.cpp
@@ -21,14 +21,10 @@
 
 namespace dap {
 
-AttachRequest::AttachRequest() = default;
-AttachRequest::~AttachRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(AttachRequest,
                               "attach",
                               DAP_FIELD(restart, "__restart"));
 
-BreakpointLocationsRequest::BreakpointLocationsRequest() = default;
-BreakpointLocationsRequest::~BreakpointLocationsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(BreakpointLocationsRequest,
                               "breakpointLocations",
                               DAP_FIELD(column, "column"),
@@ -37,15 +33,11 @@
                               DAP_FIELD(line, "line"),
                               DAP_FIELD(source, "source"));
 
-CancelRequest::CancelRequest() = default;
-CancelRequest::~CancelRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(CancelRequest,
                               "cancel",
                               DAP_FIELD(progressId, "progressId"),
                               DAP_FIELD(requestId, "requestId"));
 
-CompletionsRequest::CompletionsRequest() = default;
-CompletionsRequest::~CompletionsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(CompletionsRequest,
                               "completions",
                               DAP_FIELD(column, "column"),
@@ -53,26 +45,18 @@
                               DAP_FIELD(line, "line"),
                               DAP_FIELD(text, "text"));
 
-ConfigurationDoneRequest::ConfigurationDoneRequest() = default;
-ConfigurationDoneRequest::~ConfigurationDoneRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ConfigurationDoneRequest, "configurationDone");
 
-ContinueRequest::ContinueRequest() = default;
-ContinueRequest::~ContinueRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ContinueRequest,
                               "continue",
                               DAP_FIELD(threadId, "threadId"));
 
-DataBreakpointInfoRequest::DataBreakpointInfoRequest() = default;
-DataBreakpointInfoRequest::~DataBreakpointInfoRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(DataBreakpointInfoRequest,
                               "dataBreakpointInfo",
                               DAP_FIELD(name, "name"),
                               DAP_FIELD(variablesReference,
                                         "variablesReference"));
 
-DisassembleRequest::DisassembleRequest() = default;
-DisassembleRequest::~DisassembleRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(DisassembleRequest,
                               "disassemble",
                               DAP_FIELD(instructionCount, "instructionCount"),
@@ -81,16 +65,12 @@
                               DAP_FIELD(offset, "offset"),
                               DAP_FIELD(resolveSymbols, "resolveSymbols"));
 
-DisconnectRequest::DisconnectRequest() = default;
-DisconnectRequest::~DisconnectRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(DisconnectRequest,
                               "disconnect",
                               DAP_FIELD(restart, "restart"),
                               DAP_FIELD(terminateDebuggee,
                                         "terminateDebuggee"));
 
-EvaluateRequest::EvaluateRequest() = default;
-EvaluateRequest::~EvaluateRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(EvaluateRequest,
                               "evaluate",
                               DAP_FIELD(context, "context"),
@@ -98,29 +78,21 @@
                               DAP_FIELD(format, "format"),
                               DAP_FIELD(frameId, "frameId"));
 
-ExceptionInfoRequest::ExceptionInfoRequest() = default;
-ExceptionInfoRequest::~ExceptionInfoRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ExceptionInfoRequest,
                               "exceptionInfo",
                               DAP_FIELD(threadId, "threadId"));
 
-GotoRequest::GotoRequest() = default;
-GotoRequest::~GotoRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(GotoRequest,
                               "goto",
                               DAP_FIELD(targetId, "targetId"),
                               DAP_FIELD(threadId, "threadId"));
 
-GotoTargetsRequest::GotoTargetsRequest() = default;
-GotoTargetsRequest::~GotoTargetsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(GotoTargetsRequest,
                               "gotoTargets",
                               DAP_FIELD(column, "column"),
                               DAP_FIELD(line, "line"),
                               DAP_FIELD(source, "source"));
 
-InitializeRequest::InitializeRequest() = default;
-InitializeRequest::~InitializeRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(
     InitializeRequest,
     "initialize",
@@ -137,63 +109,43 @@
     DAP_FIELD(supportsVariablePaging, "supportsVariablePaging"),
     DAP_FIELD(supportsVariableType, "supportsVariableType"));
 
-LaunchRequest::LaunchRequest() = default;
-LaunchRequest::~LaunchRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(LaunchRequest,
                               "launch",
                               DAP_FIELD(restart, "__restart"),
                               DAP_FIELD(noDebug, "noDebug"));
 
-LoadedSourcesRequest::LoadedSourcesRequest() = default;
-LoadedSourcesRequest::~LoadedSourcesRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(LoadedSourcesRequest, "loadedSources");
 
-ModulesRequest::ModulesRequest() = default;
-ModulesRequest::~ModulesRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ModulesRequest,
                               "modules",
                               DAP_FIELD(moduleCount, "moduleCount"),
                               DAP_FIELD(startModule, "startModule"));
 
-NextRequest::NextRequest() = default;
-NextRequest::~NextRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(NextRequest,
                               "next",
                               DAP_FIELD(granularity, "granularity"),
                               DAP_FIELD(threadId, "threadId"));
 
-PauseRequest::PauseRequest() = default;
-PauseRequest::~PauseRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(PauseRequest,
                               "pause",
                               DAP_FIELD(threadId, "threadId"));
 
-ReadMemoryRequest::ReadMemoryRequest() = default;
-ReadMemoryRequest::~ReadMemoryRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ReadMemoryRequest,
                               "readMemory",
                               DAP_FIELD(count, "count"),
                               DAP_FIELD(memoryReference, "memoryReference"),
                               DAP_FIELD(offset, "offset"));
 
-RestartFrameRequest::RestartFrameRequest() = default;
-RestartFrameRequest::~RestartFrameRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(RestartFrameRequest,
                               "restartFrame",
                               DAP_FIELD(frameId, "frameId"));
 
-RestartRequest::RestartRequest() = default;
-RestartRequest::~RestartRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(RestartRequest, "restart");
 
-ReverseContinueRequest::ReverseContinueRequest() = default;
-ReverseContinueRequest::~ReverseContinueRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ReverseContinueRequest,
                               "reverseContinue",
                               DAP_FIELD(threadId, "threadId"));
 
-RunInTerminalRequest::RunInTerminalRequest() = default;
-RunInTerminalRequest::~RunInTerminalRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(RunInTerminalRequest,
                               "runInTerminal",
                               DAP_FIELD(args, "args"),
@@ -202,14 +154,10 @@
                               DAP_FIELD(kind, "kind"),
                               DAP_FIELD(title, "title"));
 
-ScopesRequest::ScopesRequest() = default;
-ScopesRequest::~ScopesRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ScopesRequest,
                               "scopes",
                               DAP_FIELD(frameId, "frameId"));
 
-SetBreakpointsRequest::SetBreakpointsRequest() = default;
-SetBreakpointsRequest::~SetBreakpointsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetBreakpointsRequest,
                               "setBreakpoints",
                               DAP_FIELD(breakpoints, "breakpoints"),
@@ -217,21 +165,15 @@
                               DAP_FIELD(source, "source"),
                               DAP_FIELD(sourceModified, "sourceModified"));
 
-SetDataBreakpointsRequest::SetDataBreakpointsRequest() = default;
-SetDataBreakpointsRequest::~SetDataBreakpointsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetDataBreakpointsRequest,
                               "setDataBreakpoints",
                               DAP_FIELD(breakpoints, "breakpoints"));
 
-SetExceptionBreakpointsRequest::SetExceptionBreakpointsRequest() = default;
-SetExceptionBreakpointsRequest::~SetExceptionBreakpointsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetExceptionBreakpointsRequest,
                               "setExceptionBreakpoints",
                               DAP_FIELD(exceptionOptions, "exceptionOptions"),
                               DAP_FIELD(filters, "filters"));
 
-SetExpressionRequest::SetExpressionRequest() = default;
-SetExpressionRequest::~SetExpressionRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetExpressionRequest,
                               "setExpression",
                               DAP_FIELD(expression, "expression"),
@@ -239,20 +181,14 @@
                               DAP_FIELD(frameId, "frameId"),
                               DAP_FIELD(value, "value"));
 
-SetFunctionBreakpointsRequest::SetFunctionBreakpointsRequest() = default;
-SetFunctionBreakpointsRequest::~SetFunctionBreakpointsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetFunctionBreakpointsRequest,
                               "setFunctionBreakpoints",
                               DAP_FIELD(breakpoints, "breakpoints"));
 
-SetInstructionBreakpointsRequest::SetInstructionBreakpointsRequest() = default;
-SetInstructionBreakpointsRequest::~SetInstructionBreakpointsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetInstructionBreakpointsRequest,
                               "setInstructionBreakpoints",
                               DAP_FIELD(breakpoints, "breakpoints"));
 
-SetVariableRequest::SetVariableRequest() = default;
-SetVariableRequest::~SetVariableRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetVariableRequest,
                               "setVariable",
                               DAP_FIELD(format, "format"),
@@ -261,15 +197,11 @@
                               DAP_FIELD(variablesReference,
                                         "variablesReference"));
 
-SourceRequest::SourceRequest() = default;
-SourceRequest::~SourceRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SourceRequest,
                               "source",
                               DAP_FIELD(source, "source"),
                               DAP_FIELD(sourceReference, "sourceReference"));
 
-StackTraceRequest::StackTraceRequest() = default;
-StackTraceRequest::~StackTraceRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StackTraceRequest,
                               "stackTrace",
                               DAP_FIELD(format, "format"),
@@ -277,52 +209,36 @@
                               DAP_FIELD(startFrame, "startFrame"),
                               DAP_FIELD(threadId, "threadId"));
 
-StepBackRequest::StepBackRequest() = default;
-StepBackRequest::~StepBackRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StepBackRequest,
                               "stepBack",
                               DAP_FIELD(granularity, "granularity"),
                               DAP_FIELD(threadId, "threadId"));
 
-StepInRequest::StepInRequest() = default;
-StepInRequest::~StepInRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StepInRequest,
                               "stepIn",
                               DAP_FIELD(granularity, "granularity"),
                               DAP_FIELD(targetId, "targetId"),
                               DAP_FIELD(threadId, "threadId"));
 
-StepInTargetsRequest::StepInTargetsRequest() = default;
-StepInTargetsRequest::~StepInTargetsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StepInTargetsRequest,
                               "stepInTargets",
                               DAP_FIELD(frameId, "frameId"));
 
-StepOutRequest::StepOutRequest() = default;
-StepOutRequest::~StepOutRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StepOutRequest,
                               "stepOut",
                               DAP_FIELD(granularity, "granularity"),
                               DAP_FIELD(threadId, "threadId"));
 
-TerminateRequest::TerminateRequest() = default;
-TerminateRequest::~TerminateRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(TerminateRequest,
                               "terminate",
                               DAP_FIELD(restart, "restart"));
 
-TerminateThreadsRequest::TerminateThreadsRequest() = default;
-TerminateThreadsRequest::~TerminateThreadsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(TerminateThreadsRequest,
                               "terminateThreads",
                               DAP_FIELD(threadIds, "threadIds"));
 
-ThreadsRequest::ThreadsRequest() = default;
-ThreadsRequest::~ThreadsRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ThreadsRequest, "threads");
 
-VariablesRequest::VariablesRequest() = default;
-VariablesRequest::~VariablesRequest() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(VariablesRequest,
                               "variables",
                               DAP_FIELD(count, "count"),
diff --git a/src/protocol_response.cpp b/src/protocol_response.cpp
index ccf04cc..99a278f 100644
--- a/src/protocol_response.cpp
+++ b/src/protocol_response.cpp
@@ -21,39 +21,25 @@
 
 namespace dap {
 
-AttachResponse::AttachResponse() = default;
-AttachResponse::~AttachResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(AttachResponse, "");
 
-BreakpointLocationsResponse::BreakpointLocationsResponse() = default;
-BreakpointLocationsResponse::~BreakpointLocationsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(BreakpointLocationsResponse,
                               "",
                               DAP_FIELD(breakpoints, "breakpoints"));
 
-CancelResponse::CancelResponse() = default;
-CancelResponse::~CancelResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(CancelResponse, "");
 
-CompletionsResponse::CompletionsResponse() = default;
-CompletionsResponse::~CompletionsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(CompletionsResponse,
                               "",
                               DAP_FIELD(targets, "targets"));
 
-ConfigurationDoneResponse::ConfigurationDoneResponse() = default;
-ConfigurationDoneResponse::~ConfigurationDoneResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ConfigurationDoneResponse, "");
 
-ContinueResponse::ContinueResponse() = default;
-ContinueResponse::~ContinueResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ContinueResponse,
                               "",
                               DAP_FIELD(allThreadsContinued,
                                         "allThreadsContinued"));
 
-DataBreakpointInfoResponse::DataBreakpointInfoResponse() = default;
-DataBreakpointInfoResponse::~DataBreakpointInfoResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(DataBreakpointInfoResponse,
                               "",
                               DAP_FIELD(accessTypes, "accessTypes"),
@@ -61,22 +47,14 @@
                               DAP_FIELD(dataId, "dataId"),
                               DAP_FIELD(description, "description"));
 
-DisassembleResponse::DisassembleResponse() = default;
-DisassembleResponse::~DisassembleResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(DisassembleResponse,
                               "",
                               DAP_FIELD(instructions, "instructions"));
 
-DisconnectResponse::DisconnectResponse() = default;
-DisconnectResponse::~DisconnectResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(DisconnectResponse, "");
 
-ErrorResponse::ErrorResponse() = default;
-ErrorResponse::~ErrorResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ErrorResponse, "", DAP_FIELD(error, "error"));
 
-EvaluateResponse::EvaluateResponse() = default;
-EvaluateResponse::~EvaluateResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(EvaluateResponse,
                               "",
                               DAP_FIELD(indexedVariables, "indexedVariables"),
@@ -88,8 +66,6 @@
                               DAP_FIELD(variablesReference,
                                         "variablesReference"));
 
-ExceptionInfoResponse::ExceptionInfoResponse() = default;
-ExceptionInfoResponse::~ExceptionInfoResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ExceptionInfoResponse,
                               "",
                               DAP_FIELD(breakMode, "breakMode"),
@@ -97,18 +73,12 @@
                               DAP_FIELD(details, "details"),
                               DAP_FIELD(exceptionId, "exceptionId"));
 
-GotoResponse::GotoResponse() = default;
-GotoResponse::~GotoResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(GotoResponse, "");
 
-GotoTargetsResponse::GotoTargetsResponse() = default;
-GotoTargetsResponse::~GotoTargetsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(GotoTargetsResponse,
                               "",
                               DAP_FIELD(targets, "targets"));
 
-InitializeResponse::InitializeResponse() = default;
-InitializeResponse::~InitializeResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(
     InitializeResponse,
     "",
@@ -154,80 +124,50 @@
     DAP_FIELD(supportsValueFormattingOptions,
               "supportsValueFormattingOptions"));
 
-LaunchResponse::LaunchResponse() = default;
-LaunchResponse::~LaunchResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(LaunchResponse, "");
 
-LoadedSourcesResponse::LoadedSourcesResponse() = default;
-LoadedSourcesResponse::~LoadedSourcesResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(LoadedSourcesResponse,
                               "",
                               DAP_FIELD(sources, "sources"));
 
-ModulesResponse::ModulesResponse() = default;
-ModulesResponse::~ModulesResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ModulesResponse,
                               "",
                               DAP_FIELD(modules, "modules"),
                               DAP_FIELD(totalModules, "totalModules"));
 
-NextResponse::NextResponse() = default;
-NextResponse::~NextResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(NextResponse, "");
 
-PauseResponse::PauseResponse() = default;
-PauseResponse::~PauseResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(PauseResponse, "");
 
-ReadMemoryResponse::ReadMemoryResponse() = default;
-ReadMemoryResponse::~ReadMemoryResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ReadMemoryResponse,
                               "",
                               DAP_FIELD(address, "address"),
                               DAP_FIELD(data, "data"),
                               DAP_FIELD(unreadableBytes, "unreadableBytes"));
 
-RestartFrameResponse::RestartFrameResponse() = default;
-RestartFrameResponse::~RestartFrameResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(RestartFrameResponse, "");
 
-RestartResponse::RestartResponse() = default;
-RestartResponse::~RestartResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(RestartResponse, "");
 
-ReverseContinueResponse::ReverseContinueResponse() = default;
-ReverseContinueResponse::~ReverseContinueResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ReverseContinueResponse, "");
 
-RunInTerminalResponse::RunInTerminalResponse() = default;
-RunInTerminalResponse::~RunInTerminalResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(RunInTerminalResponse,
                               "",
                               DAP_FIELD(processId, "processId"),
                               DAP_FIELD(shellProcessId, "shellProcessId"));
 
-ScopesResponse::ScopesResponse() = default;
-ScopesResponse::~ScopesResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ScopesResponse, "", DAP_FIELD(scopes, "scopes"));
 
-SetBreakpointsResponse::SetBreakpointsResponse() = default;
-SetBreakpointsResponse::~SetBreakpointsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetBreakpointsResponse,
                               "",
                               DAP_FIELD(breakpoints, "breakpoints"));
 
-SetDataBreakpointsResponse::SetDataBreakpointsResponse() = default;
-SetDataBreakpointsResponse::~SetDataBreakpointsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetDataBreakpointsResponse,
                               "",
                               DAP_FIELD(breakpoints, "breakpoints"));
 
-SetExceptionBreakpointsResponse::SetExceptionBreakpointsResponse() = default;
-SetExceptionBreakpointsResponse::~SetExceptionBreakpointsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetExceptionBreakpointsResponse, "");
 
-SetExpressionResponse::SetExpressionResponse() = default;
-SetExpressionResponse::~SetExpressionResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetExpressionResponse,
                               "",
                               DAP_FIELD(indexedVariables, "indexedVariables"),
@@ -238,22 +178,14 @@
                               DAP_FIELD(variablesReference,
                                         "variablesReference"));
 
-SetFunctionBreakpointsResponse::SetFunctionBreakpointsResponse() = default;
-SetFunctionBreakpointsResponse::~SetFunctionBreakpointsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetFunctionBreakpointsResponse,
                               "",
                               DAP_FIELD(breakpoints, "breakpoints"));
 
-SetInstructionBreakpointsResponse::SetInstructionBreakpointsResponse() =
-    default;
-SetInstructionBreakpointsResponse::~SetInstructionBreakpointsResponse() =
-    default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetInstructionBreakpointsResponse,
                               "",
                               DAP_FIELD(breakpoints, "breakpoints"));
 
-SetVariableResponse::SetVariableResponse() = default;
-SetVariableResponse::~SetVariableResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SetVariableResponse,
                               "",
                               DAP_FIELD(indexedVariables, "indexedVariables"),
@@ -263,54 +195,34 @@
                               DAP_FIELD(variablesReference,
                                         "variablesReference"));
 
-SourceResponse::SourceResponse() = default;
-SourceResponse::~SourceResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SourceResponse,
                               "",
                               DAP_FIELD(content, "content"),
                               DAP_FIELD(mimeType, "mimeType"));
 
-StackTraceResponse::StackTraceResponse() = default;
-StackTraceResponse::~StackTraceResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StackTraceResponse,
                               "",
                               DAP_FIELD(stackFrames, "stackFrames"),
                               DAP_FIELD(totalFrames, "totalFrames"));
 
-StepBackResponse::StepBackResponse() = default;
-StepBackResponse::~StepBackResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StepBackResponse, "");
 
-StepInResponse::StepInResponse() = default;
-StepInResponse::~StepInResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StepInResponse, "");
 
-StepInTargetsResponse::StepInTargetsResponse() = default;
-StepInTargetsResponse::~StepInTargetsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StepInTargetsResponse,
                               "",
                               DAP_FIELD(targets, "targets"));
 
-StepOutResponse::StepOutResponse() = default;
-StepOutResponse::~StepOutResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StepOutResponse, "");
 
-TerminateResponse::TerminateResponse() = default;
-TerminateResponse::~TerminateResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(TerminateResponse, "");
 
-TerminateThreadsResponse::TerminateThreadsResponse() = default;
-TerminateThreadsResponse::~TerminateThreadsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(TerminateThreadsResponse, "");
 
-ThreadsResponse::ThreadsResponse() = default;
-ThreadsResponse::~ThreadsResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ThreadsResponse,
                               "",
                               DAP_FIELD(threads, "threads"));
 
-VariablesResponse::VariablesResponse() = default;
-VariablesResponse::~VariablesResponse() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(VariablesResponse,
                               "",
                               DAP_FIELD(variables, "variables"));
diff --git a/src/protocol_types.cpp b/src/protocol_types.cpp
index 7d30567..61047cd 100644
--- a/src/protocol_types.cpp
+++ b/src/protocol_types.cpp
@@ -21,19 +21,13 @@
 
 namespace dap {
 
-ChecksumAlgorithm::ChecksumAlgorithm() = default;
-ChecksumAlgorithm::~ChecksumAlgorithm() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ChecksumAlgorithm, "");
 
-Checksum::Checksum() = default;
-Checksum::~Checksum() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(Checksum,
                               "",
                               DAP_FIELD(algorithm, "algorithm"),
                               DAP_FIELD(checksum, "checksum"));
 
-Source::Source() = default;
-Source::~Source() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(Source,
                               "",
                               DAP_FIELD(adapterData, "adapterData"),
@@ -45,8 +39,6 @@
                               DAP_FIELD(sourceReference, "sourceReference"),
                               DAP_FIELD(sources, "sources"));
 
-Breakpoint::Breakpoint() = default;
-Breakpoint::~Breakpoint() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(Breakpoint,
                               "",
                               DAP_FIELD(column, "column"),
@@ -61,8 +53,6 @@
                               DAP_FIELD(source, "source"),
                               DAP_FIELD(verified, "verified"));
 
-BreakpointLocation::BreakpointLocation() = default;
-BreakpointLocation::~BreakpointLocation() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(BreakpointLocation,
                               "",
                               DAP_FIELD(column, "column"),
@@ -70,8 +60,6 @@
                               DAP_FIELD(endLine, "endLine"),
                               DAP_FIELD(line, "line"));
 
-ColumnDescriptor::ColumnDescriptor() = default;
-ColumnDescriptor::~ColumnDescriptor() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ColumnDescriptor,
                               "",
                               DAP_FIELD(attributeName, "attributeName"),
@@ -80,16 +68,12 @@
                               DAP_FIELD(type, "type"),
                               DAP_FIELD(width, "width"));
 
-ExceptionBreakpointsFilter::ExceptionBreakpointsFilter() = default;
-ExceptionBreakpointsFilter::~ExceptionBreakpointsFilter() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ExceptionBreakpointsFilter,
                               "",
                               DAP_FIELD(def, "default"),
                               DAP_FIELD(filter, "filter"),
                               DAP_FIELD(label, "label"));
 
-Capabilities::Capabilities() = default;
-Capabilities::~Capabilities() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(
     Capabilities,
     "",
@@ -135,12 +119,8 @@
     DAP_FIELD(supportsValueFormattingOptions,
               "supportsValueFormattingOptions"));
 
-CompletionItemType::CompletionItemType() = default;
-CompletionItemType::~CompletionItemType() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(CompletionItemType, "");
 
-CompletionItem::CompletionItem() = default;
-CompletionItem::~CompletionItem() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(CompletionItem,
                               "",
                               DAP_FIELD(label, "label"),
@@ -152,12 +132,8 @@
                               DAP_FIELD(text, "text"),
                               DAP_FIELD(type, "type"));
 
-DataBreakpointAccessType::DataBreakpointAccessType() = default;
-DataBreakpointAccessType::~DataBreakpointAccessType() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(DataBreakpointAccessType, "");
 
-DisassembledInstruction::DisassembledInstruction() = default;
-DisassembledInstruction::~DisassembledInstruction() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(DisassembledInstruction,
                               "",
                               DAP_FIELD(address, "address"),
@@ -170,8 +146,6 @@
                               DAP_FIELD(location, "location"),
                               DAP_FIELD(symbol, "symbol"));
 
-Message::Message() = default;
-Message::~Message() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(Message,
                               "",
                               DAP_FIELD(format, "format"),
@@ -182,24 +156,16 @@
                               DAP_FIELD(urlLabel, "urlLabel"),
                               DAP_FIELD(variables, "variables"));
 
-VariablePresentationHint::VariablePresentationHint() = default;
-VariablePresentationHint::~VariablePresentationHint() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(VariablePresentationHint,
                               "",
                               DAP_FIELD(attributes, "attributes"),
                               DAP_FIELD(kind, "kind"),
                               DAP_FIELD(visibility, "visibility"));
 
-ValueFormat::ValueFormat() = default;
-ValueFormat::~ValueFormat() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ValueFormat, "", DAP_FIELD(hex, "hex"));
 
-ExceptionBreakMode::ExceptionBreakMode() = default;
-ExceptionBreakMode::~ExceptionBreakMode() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ExceptionBreakMode, "");
 
-ExceptionDetails::ExceptionDetails() = default;
-ExceptionDetails::~ExceptionDetails() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ExceptionDetails,
                               "",
                               DAP_FIELD(evaluateName, "evaluateName"),
@@ -209,8 +175,6 @@
                               DAP_FIELD(stackTrace, "stackTrace"),
                               DAP_FIELD(typeName, "typeName"));
 
-GotoTarget::GotoTarget() = default;
-GotoTarget::~GotoTarget() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(GotoTarget,
                               "",
                               DAP_FIELD(column, "column"),
@@ -222,8 +186,6 @@
                               DAP_FIELD(label, "label"),
                               DAP_FIELD(line, "line"));
 
-Module::Module() = default;
-Module::~Module() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(Module,
                               "",
                               DAP_FIELD(addressRange, "addressRange"),
@@ -237,12 +199,8 @@
                               DAP_FIELD(symbolStatus, "symbolStatus"),
                               DAP_FIELD(version, "version"));
 
-SteppingGranularity::SteppingGranularity() = default;
-SteppingGranularity::~SteppingGranularity() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SteppingGranularity, "");
 
-Scope::Scope() = default;
-Scope::~Scope() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(Scope,
                               "",
                               DAP_FIELD(column, "column"),
@@ -258,8 +216,6 @@
                               DAP_FIELD(variablesReference,
                                         "variablesReference"));
 
-SourceBreakpoint::SourceBreakpoint() = default;
-SourceBreakpoint::~SourceBreakpoint() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(SourceBreakpoint,
                               "",
                               DAP_FIELD(column, "column"),
@@ -268,8 +224,6 @@
                               DAP_FIELD(line, "line"),
                               DAP_FIELD(logMessage, "logMessage"));
 
-DataBreakpoint::DataBreakpoint() = default;
-DataBreakpoint::~DataBreakpoint() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(DataBreakpoint,
                               "",
                               DAP_FIELD(accessType, "accessType"),
@@ -277,30 +231,22 @@
                               DAP_FIELD(dataId, "dataId"),
                               DAP_FIELD(hitCondition, "hitCondition"));
 
-ExceptionPathSegment::ExceptionPathSegment() = default;
-ExceptionPathSegment::~ExceptionPathSegment() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ExceptionPathSegment,
                               "",
                               DAP_FIELD(names, "names"),
                               DAP_FIELD(negate, "negate"));
 
-ExceptionOptions::ExceptionOptions() = default;
-ExceptionOptions::~ExceptionOptions() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(ExceptionOptions,
                               "",
                               DAP_FIELD(breakMode, "breakMode"),
                               DAP_FIELD(path, "path"));
 
-FunctionBreakpoint::FunctionBreakpoint() = default;
-FunctionBreakpoint::~FunctionBreakpoint() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(FunctionBreakpoint,
                               "",
                               DAP_FIELD(condition, "condition"),
                               DAP_FIELD(hitCondition, "hitCondition"),
                               DAP_FIELD(name, "name"));
 
-InstructionBreakpoint::InstructionBreakpoint() = default;
-InstructionBreakpoint::~InstructionBreakpoint() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(InstructionBreakpoint,
                               "",
                               DAP_FIELD(condition, "condition"),
@@ -309,8 +255,6 @@
                                         "instructionReference"),
                               DAP_FIELD(offset, "offset"));
 
-StackFrame::StackFrame() = default;
-StackFrame::~StackFrame() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StackFrame,
                               "",
                               DAP_FIELD(column, "column"),
@@ -325,8 +269,6 @@
                               DAP_FIELD(presentationHint, "presentationHint"),
                               DAP_FIELD(source, "source"));
 
-StackFrameFormat::StackFrameFormat() = default;
-StackFrameFormat::~StackFrameFormat() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StackFrameFormat,
                               "",
                               DAP_FIELD(includeAll, "includeAll"),
@@ -337,22 +279,16 @@
                               DAP_FIELD(parameterValues, "parameterValues"),
                               DAP_FIELD(parameters, "parameters"));
 
-StepInTarget::StepInTarget() = default;
-StepInTarget::~StepInTarget() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(StepInTarget,
                               "",
                               DAP_FIELD(id, "id"),
                               DAP_FIELD(label, "label"));
 
-Thread::Thread() = default;
-Thread::~Thread() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(Thread,
                               "",
                               DAP_FIELD(id, "id"),
                               DAP_FIELD(name, "name"));
 
-Variable::Variable() = default;
-Variable::~Variable() = default;
 DAP_IMPLEMENT_STRUCT_TYPEINFO(Variable,
                               "",
                               DAP_FIELD(evaluateName, "evaluateName"),
diff --git a/src/session.cpp b/src/session.cpp
index 6344e5a..4ea85a4 100644
--- a/src/session.cpp
+++ b/src/session.cpp
@@ -481,6 +481,8 @@
   message = buf;
 }
 
+Session::~Session() = default;
+
 std::unique_ptr<Session> Session::create() {
   return std::unique_ptr<Session>(new Impl());
 }
diff --git a/src/typeinfo.cpp b/src/typeinfo.cpp
new file mode 100644
index 0000000..dda481f
--- /dev/null
+++ b/src/typeinfo.cpp
@@ -0,0 +1,21 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "dap/typeinfo.h"
+
+namespace dap {
+
+TypeInfo::~TypeInfo() = default;
+
+}  // namespace dap
diff --git a/tools/protocol_gen/protocol_gen.go b/tools/protocol_gen/protocol_gen.go
index 781c053..b23b622 100644
--- a/tools/protocol_gen/protocol_gen.go
+++ b/tools/protocol_gen/protocol_gen.go
@@ -313,16 +313,6 @@
 		io.WriteString(w, ";")
 	}
 
-	// constructor
-	io.WriteString(w, "\n\n  ")
-	io.WriteString(w, s.name)
-	io.WriteString(w, "();")
-
-	// destructor
-	io.WriteString(w, "\n  ~")
-	io.WriteString(w, s.name)
-	io.WriteString(w, "();\n")
-
 	for _, f := range s.fields {
 		if f.desc != "" {
 			io.WriteString(w, "\n  // ")
@@ -353,18 +343,6 @@
 }
 
 func (s *cppStruct) writeCPP(w io.Writer) {
-	// constructor
-	io.WriteString(w, s.name)
-	io.WriteString(w, "::")
-	io.WriteString(w, s.name)
-	io.WriteString(w, "() = default;\n")
-
-	// destructor
-	io.WriteString(w, s.name)
-	io.WriteString(w, "::~")
-	io.WriteString(w, s.name)
-	io.WriteString(w, "() = default;\n")
-
 	// typeinfo
 	io.WriteString(w, "DAP_IMPLEMENT_STRUCT_TYPEINFO(")
 	io.WriteString(w, s.name)